通话详情页

This commit is contained in:
小李 2026-05-27 16:14:34 +08:00
parent 1d4fd42cbb
commit 86434ab815
55 changed files with 2888 additions and 164 deletions

View File

@ -3,9 +3,10 @@
<view v-for="(item, index) in list" :key="index" class="item" @touchstart="touchStart($event, index)" <view v-for="(item, index) in list" :key="index" class="item" @touchstart="touchStart($event, index)"
@touchmove="touchMove($event, index)" @touchend="touchEnd($event, index)" @touchmove="touchMove($event, index)" @touchend="touchEnd($event, index)"
:style="{ 'transform': 'translateX(' + swiperList[index] + 'px)', 'transition': swiperList[index] == 0 ? 'all 0.3s' : '' }"> :style="{ 'transform': 'translateX(' + swiperList[index] + 'px)', 'transition': swiperList[index] == 0 ? 'all 0.3s' : '' }">
<view class="avatar" v-if="type != 'xiaomi'"> <view class="avatar" v-if="type != 'xiaomi'" @click="goDetail(item,index)">
<!-- 显示文字头像 --> <!-- 显示文字头像 -->
<view v-if="type == 'ios' && item.name && item.avatarType === 'text'" class="text-avatar" :class="{'text-avatar-18':getAvatarLength(item.name)==2}"> <view v-if="type == 'ios' && item.name && item.avatarType === 'text'" class="text-avatar"
:class="{'text-avatar-18':getAvatarLength(item.name)==2}">
{{ getAvatarText(item.name) }} {{ getAvatarText(item.name) }}
</view> </view>
<!-- 显示图片头像 --> <!-- 显示图片头像 -->
@ -30,7 +31,7 @@
<image v-else-if="type == 'vivo'&&(item.status==1||item.status==2)" <image v-else-if="type == 'vivo'&&(item.status==1||item.status==2)"
:src="`/static/image/call/vivoStatusIcon1.png`" mode="widthFix"> </image> :src="`/static/image/call/vivoStatusIcon1.png`" mode="widthFix"> </image>
</view> </view>
<view class="infoBox"> <view class="infoBox" @click="goDetail(item,index)">
<view class="left-box"> <view class="left-box">
<view class="leftInfo"> <view class="leftInfo">
<view class="title" :class="{ 'title-red': item.status == 3 }"> <view class="title" :class="{ 'title-red': item.status == 3 }">
@ -154,8 +155,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">状态</text> <text class="form-label">状态</text>
<uni-data-select class="form-select" v-model="editForm.status" :localdata="statusOptions" @change="onStatusChange" <uni-data-select class="form-select" v-model="editForm.status" :localdata="statusOptions"
:clear="false"></uni-data-select> @change="onStatusChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">电话备注</text> <text class="form-label">电话备注</text>
@ -163,8 +164,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像类型</text> <text class="form-label">头像类型</text>
<uni-data-select class="form-select" v-model="editForm.avatarType" :localdata="avatarTypeOptions" @change="onAvatarTypeChange" <uni-data-select class="form-select" v-model="editForm.avatarType" :localdata="avatarTypeOptions"
:clear="false"></uni-data-select> @change="onAvatarTypeChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像</text> <text class="form-label">头像</text>
@ -227,8 +228,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">状态 <text>*</text></text> <text class="form-label">状态 <text>*</text></text>
<uni-data-select class="form-select" v-model="addForm.status" :localdata="statusOptions" @change="onAddStatusChange" <uni-data-select class="form-select" v-model="addForm.status" :localdata="statusOptions"
:clear="false"></uni-data-select> @change="onAddStatusChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">卡几</text> <text class="form-label">卡几</text>
@ -249,8 +250,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像类型</text> <text class="form-label">头像类型</text>
<uni-data-select class="form-select" v-model="addForm.avatarType" :localdata="avatarTypeOptions" @change="onAddAvatarTypeChange" <uni-data-select class="form-select" v-model="addForm.avatarType" :localdata="avatarTypeOptions"
:clear="false"></uni-data-select> @change="onAddAvatarTypeChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像</text> <text class="form-label">头像</text>
@ -304,8 +305,12 @@
import { import {
onUnload onUnload
} from "@dcloudio/uni-app"; } from "@dcloudio/uni-app";
import DateTimePicker from '@/components/dengrq-datetime-picker/dateTimePicker/index.vue'; import DateTimePicker from '@/components/dengrq-datetime-picker/dateTimePicker/index.vue'; import {
useStore
} from '@/store/index.js'
const {
setCallDetail
} = useStore()
const props = defineProps({ const props = defineProps({
isHuise: { isHuise: {
type: Boolean, type: Boolean,
@ -691,6 +696,12 @@
} }
]); ]);
const goDetail = (value,index) => {
setCallDetail(value)
uni.navigateTo({
url:'/pages/call-log/detail/callDetail?type='+props.type+'&index='+index
})
};
// //
const getKjText = (value) => { const getKjText = (value) => {
return value || '请选择'; return value || '请选择';
@ -795,7 +806,7 @@
editForm.kj = item.kj || '1'; editForm.kj = item.kj || '1';
editForm.address = item.address || ''; editForm.address = item.address || '';
editForm.time = item.time || ''; editForm.time = item.time || '';
editForm.status = item.status ||0; editForm.status = item.status || 0;
editForm.notes = item.notes || ''; editForm.notes = item.notes || '';
showEditModal.value = true; showEditModal.value = true;
}; };
@ -1093,7 +1104,7 @@
// //
const cleanStr = str.replace(/\s+/g, ''); const cleanStr = str.replace(/\s+/g, '');
if (cleanStr.length <= 3) { if (cleanStr.length !=11) {
return cleanStr; return cleanStr;
} }
@ -1123,7 +1134,7 @@
function choose() { function choose() {
uni.chooseImage({ uni.chooseImage({
count: 1, count: 1,
sourceType: [ 'album' , 'camera'], sourceType: ['album', 'camera'],
maxDuration: 30, maxDuration: 30,
camera: 'back', camera: 'back',
success(res) { success(res) {
@ -1168,7 +1179,7 @@
}); });
} }
}) })
} }
// //
const getAvatarText = (name) => { const getAvatarText = (name) => {
@ -1430,6 +1441,7 @@
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 -0.3px 0 0 #C2C2C2; box-shadow: 0 -0.3px 0 0 #C2C2C2;
.left-box { .left-box {
.title { .title {
font-weight: 400; font-weight: 400;
@ -1528,10 +1540,11 @@
} }
.call-list-oppo { .call-list-oppo {
.kj{ .kj {
width: 20rpx !important; width: 20rpx !important;
height: 24rpx !important; height: 24rpx !important;
} }
.item { .item {
padding: 32rpx 36rpx 0 36rpx !important; padding: 32rpx 36rpx 0 36rpx !important;
justify-content: space-between; justify-content: space-between;
@ -1645,10 +1658,11 @@
} }
.call-list-huawei { .call-list-huawei {
.kj{ .kj {
width: 18rpx !important; width: 18rpx !important;
height: 22rpx !important; height: 22rpx !important;
} }
.item { .item {
padding: 24rpx 32rpx 0 32rpx !important; padding: 24rpx 32rpx 0 32rpx !important;
justify-content: space-between; justify-content: space-between;
@ -1757,7 +1771,8 @@
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
margin-bottom: 16rpx; margin-bottom: 16rpx;
text{
text {
color: red; color: red;
} }
} }
@ -1772,18 +1787,22 @@
box-sizing: border-box; box-sizing: border-box;
color: #1A1A1A; color: #1A1A1A;
} }
.form-select{
.form-select {
width: 364rpx !important; width: 364rpx !important;
flex: none; flex: none;
} }
.form-avatar-container { .form-avatar-container {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.suiji{
.suiji {
width: 50rpx; width: 50rpx;
height: 50rpx; height: 50rpx;
} }
.form-avatar { .form-avatar {
width: 80px; width: 80px;
height: 80px; height: 80px;
@ -1828,9 +1847,11 @@
font-weight: bold; font-weight: bold;
background: linear-gradient(180deg, #A1A8B8 0%, #878B94 100%); background: linear-gradient(180deg, #A1A8B8 0%, #878B94 100%);
} }
.text-avatar-18{
.text-avatar-18 {
font-size: 36rpx !important; font-size: 36rpx !important;
} }
.form-input-time { .form-input-time {
line-height: 40px; line-height: 40px;
} }

View File

@ -6,10 +6,7 @@
</view> </view>
</view> </view>
<view class="footer footerZhangwei" :class="['footer_'+type]"> <view class="footer footerZhangwei" :class="['footer_'+type]">
<view class="item" v-for="(item,index) in list" :key="index">
<image :src="`/static/image/call/${type}TabbarImg${index+1}.png`" mode=""></image>
<text>{{item}}</text>
</view>
</view> </view>
</template> </template>
@ -86,10 +83,7 @@
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.footerZhangwei{
position: relative !important;
opacity: 0 !important;
}
.footer { .footer {
position: fixed; position: fixed;
left: 0; left: 0;
@ -98,7 +92,7 @@
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
background: #f7f7f7; background: #f7f7f7;
padding-top: 2px;
.item { .item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -118,7 +112,6 @@
} }
.footer_ios { .footer_ios {
padding-top: 2px;
padding-bottom: constant(safe-area-inset-bottom) !important; // IOS<11.2 padding-bottom: constant(safe-area-inset-bottom) !important; // IOS<11.2
padding-bottom: env(safe-area-inset-bottom) !important; // IOS>11.2 padding-bottom: env(safe-area-inset-bottom) !important; // IOS>11.2
.item:nth-child(2) { .item:nth-child(2) {
@ -127,6 +120,13 @@
} }
} }
} }
.footerZhangwei{
position: relative !important;
opacity: 0 !important;
padding-top: 0 !important;
height: 47px;
background-color: rgba(0, 0, 0, 0) !important;
}
.footer_huawei { .footer_huawei {
background: #FAFAFA !important; background: #FAFAFA !important;
padding-top: 3px; padding-top: 3px;

View File

@ -60,7 +60,7 @@ export default {
justify-content: center; justify-content: center;
z-index: 99 !important; z-index: 99 !important;
background-image: url('/static/image/watermarkBG.png'); background-image: url('/static/image/watermarkBG.png');
background-size: 125px 125px; background-size: 500rpx 500rpx;
.watermarkBox { .watermarkBox {
width: 200px; width: 200px;

View File

@ -17,6 +17,12 @@
"navigationBarTitleText": "通话记录页面", "navigationBarTitleText": "通话记录页面",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},{
"path": "detail/callDetail",
"style": {
"navigationBarTitleText": "通话记录详情",
"navigationStyle": "custom"
}
}] }]
}, },
{ {

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,12 +1,18 @@
import { reactive, ref, watch } from 'vue'; import {
import { storage } from '../utils/storage'; reactive,
ref,
watch
} from 'vue';
import {
storage
} from '../utils/storage';
// 防抖函数 // 防抖函数
const debounce = (fn, delay = 300) => { const debounce = (fn, delay = 300) => {
let timer = null let timer = null
return function (...args) { return function(...args) {
if (timer) clearTimeout(timer) if (timer) clearTimeout(timer)
timer = setTimeout(() => { timer = setTimeout(() => {
fn.apply(this, args) fn.apply(this, args)
@ -36,6 +42,7 @@ export const store = reactive({
// 账单列表 // 账单列表
billList: JSON.parse(JSON.stringify(storage.get('bill_list') || [])), billList: JSON.parse(JSON.stringify(storage.get('bill_list') || [])),
callInfo: {}
}); });
@ -51,7 +58,10 @@ export const useStore = () => {
const updateBill = (id, updates) => { const updateBill = (id, updates) => {
const index = store.billList.findIndex(bill => bill.id === id); const index = store.billList.findIndex(bill => bill.id === id);
if (index !== -1) { if (index !== -1) {
store.billList[index] = { ...store.billList[index], ...updates }; store.billList[index] = {
...store.billList[index],
...updates
};
return store.billList[index]; return store.billList[index];
} }
return null; return null;
@ -69,13 +79,20 @@ export const useStore = () => {
const getBillList = () => { const getBillList = () => {
return JSON.parse(JSON.stringify(store.billList)) return JSON.parse(JSON.stringify(store.billList))
} }
const getCallDetail = () => {
return JSON.parse(JSON.stringify(store.callInfo))
}
const setCallDetail = (info) => {
return store.callInfo = info
};
return { return {
store, store,
addBill, addBill,
updateBill, updateBill,
deleteBill, deleteBill,
getBillList getBillList,
setCallDetail,
getCallDetail
}; };
}; };
@ -86,14 +103,16 @@ const debouncedSaveSettings = debounce((newValue) => {
watch( watch(
() => store.userInfo, () => store.userInfo,
(newValue) => storage.set('userInfo', newValue), (newValue) => storage.set('userInfo', newValue), {
{ deep: true } deep: true
}
); );
watch( watch(
() => store.settings, () => store.settings,
(newValue) => debouncedSaveSettings(newValue), (newValue) => debouncedSaveSettings(newValue), {
{ deep: true } deep: true
}
); );
// 监听billList改变自动保存 // 监听billList改变自动保存
@ -102,7 +121,7 @@ watch(
(newValue) => { (newValue) => {
console.log("store.billList changed, saving...") console.log("store.billList changed, saving...")
storage.set('bill_list', newValue) storage.set('bill_list', newValue)
}, }, {
{ deep: true } deep: true
}
); );