标签管理页面

This commit is contained in:
浅念
2025-03-26 17:02:04 +08:00
parent be8674fd51
commit 8583ff2543
12 changed files with 298 additions and 20 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
// const baseUrl = "http://219.157.255.213:9007/"; //这里放置url域名32044 // const baseUrl = "http://219.157.255.213:9007/"; //这里放置url域名32044
// const baseUrl = "http://api.crm.hnxinyouhe.com/"; //这里放置url域名32044 // const baseUrl = "http://api.crm.hnxinyouhe.com/"; //这里放置url域名32044
const baseUrl = "http://192.168.50.9:8787/"; //这里放置url域名32044 const baseUrl = "http://219.157.255.213:25329/"; //这里放置url域名32044
// const baseUrl = "/api/"; //这里放置url域名32044 // const baseUrl = "/api/"; //这里放置url域名32044
export function request(options){//封装的requset export function request(options){//封装的requset
let { url,data,method } = options; let { url,data,method } = options;
+4 -1
View File
@@ -56,6 +56,8 @@ export default {
Customerphinput:'Please select customer preferences', Customerphinput:'Please select customer preferences',
Cstomerfjinput:'Please select customer rating', Cstomerfjinput:'Please select customer rating',
Countryinput:'Please select a country', Countryinput:'Please select a country',
Cstomertag:'Label',
Cstomertaginput:'Please select',
Company:'Company', Company:'Company',
Companyinput:'Go locate it', Companyinput:'Go locate it',
CustomerScreening:'Customer Screening', CustomerScreening:'Customer Screening',
@@ -172,5 +174,6 @@ export default {
second:'second', second:'second',
nextgjtime:'Next follow up time', nextgjtime:'Next follow up time',
Remindergj:'Follow up reminder', Remindergj:'Follow up reminder',
callPhonemsg:'Dial the wrong number!' callPhonemsg:'Dial the wrong number!',
download:'Download'
} }
+4 -1
View File
@@ -53,6 +53,8 @@ export default {
Customerphinput:'请选择客户偏好', Customerphinput:'请选择客户偏好',
Cstomerfj:'客户分级', Cstomerfj:'客户分级',
Cstomerfjinput:'请选择客户分级', Cstomerfjinput:'请选择客户分级',
Cstomertag:'客户标签',
Cstomertaginput:'请选择',
Country:'国家', Country:'国家',
Countryinput:'请选择国家', Countryinput:'请选择国家',
Company:'公司', Company:'公司',
@@ -171,5 +173,6 @@ export default {
second:'秒', second:'秒',
nextgjtime:'下次跟进时间', nextgjtime:'下次跟进时间',
Remindergj:'跟进提醒', Remindergj:'跟进提醒',
callPhonemsg:'拨打号码错误!' callPhonemsg:'拨打号码错误!',
download:'下载'
} }
+152 -3
View File
@@ -77,6 +77,14 @@
</view> </view>
</view> </view>
<u-line></u-line> <u-line></u-line>
<view class="cell">
<view class="item">{{$t('customer.Cstomertag')}}</view>
<view class="right select" @click="showtag = true">
<view class="" :class="['content2', { placeholder: !grade_name }]">{{grade_name || $t('customer.Cstomertaginput')}}</view>
<u-icon class="arrowright" name="arrow-right" size="18" color="#747474"></u-icon>
</view>
</view>
<u-line></u-line>
<view class="cell"> <view class="cell">
<view class="item">{{$t('customer.Country')}}</view> <view class="item">{{$t('customer.Country')}}</view>
<view class="right select" @click="showarea = true"> <view class="right select" @click="showarea = true">
@@ -118,7 +126,8 @@
<u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showcartype" @cancel="cancel('showcartype')" @close="close('showcartype')" :columns="carTypeList" keyName="name" @confirm="cartypesChange"></u-picker> <u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showcartype" @cancel="cancel('showcartype')" @close="close('showcartype')" :columns="carTypeList" keyName="name" @confirm="cartypesChange"></u-picker>
<u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showgrade" @cancel="cancel('showgrade')" @close="close('showgrade')" :columns="getGradeList" keyName="name" @confirm="gradeHandler"></u-picker> <u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showgrade" @cancel="cancel('showgrade')" @close="close('showgrade')" :columns="getGradeList" keyName="name" @confirm="gradeHandler"></u-picker>
<!-- <u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showarea" @cancel="cancel('showarea')" @close="close('showarea')" :columns="areaList" keyName="name" @confirm="areaChange"></u-picker> --> <!-- <u-picker closeOnClickOverlay :cancel-text="$t('cancel')" :confirm-text="$t('confirm')" :show="showarea" @cancel="cancel('showarea')" @close="close('showarea')" :columns="areaList" keyName="name" @confirm="areaChange"></u-picker> -->
<u-popup closeOnClickOverlay :show="showarea" mode="bottom" :round="10" @close="close('showarea')"> <!-- 国家选择 -->
<u-popup closeOnClickOverlay :show="showarea" mode="bottom" :round="10" @close="close('showarea')">
<view class="text"> <view class="text">
<view class="qx" @click="close('showarea') ">{{$t('cancel')}}</view> <view class="qx" @click="close('showarea') ">{{$t('cancel')}}</view>
<view class="qd" @click="arerfn">{{$t('confirm')}}</view> <view class="qd" @click="arerfn">{{$t('confirm')}}</view>
@@ -148,7 +157,26 @@
</scroll-view> </scroll-view>
</view> </view>
</u-popup> </u-popup>
<!-- 客户标签 -->
<u-popup closeOnClickOverlay :show="showtag" mode="bottom" :round="10" title="客户标签" @close="close('showtag')" :closeable="true" >
<view class="popup-content">
<scroll-view scroll-y class="tag-list">
<view
v-for="(item, index) in taglist"
:key="index"
class="tags"
>
<view class="name">{{ item.name }}</view>
<view class="row">
<view class="col4 tagitem" v-for="(item1, index1) in item.child" :class="{ 'tagactive': isActive(item1.pid, item1.id) }" @click="tagSelect(item1)" :key="index1">
{{ item1.name }}
</view>
</view>
</view>
</scroll-view>
</view>
</u-popup>
</view> </view>
</template> </template>
<script> <script>
@@ -157,10 +185,12 @@
data() { data() {
return { return {
actives:'', actives:'',
activetags:'',
searchKeyword: "", // 搜索关键词 searchKeyword: "", // 搜索关键词
selectedLabel: "", // 选中的值(显示在输入框中) selectedLabel: "", // 选中的值(显示在输入框中)
filteredOptions: [], // 过滤后的数据 filteredOptions: [], // 过滤后的数据
mapUrl: '', mapUrl: '',
showtag: false,
showmap: false, showmap: false,
showmagnitude: false, showmagnitude: false,
showgrade: false, showgrade: false,
@@ -192,7 +222,87 @@
lat:'', lat:'',
lng:'', lng:'',
}, },
location:{} location:{},
activeMap: {}, // 存储每个父级下选中的子项 { 父ID: 子ID }
taglist:[
{
name:'客户价值',
id:'1',
child:[
{name:'高价值',id:1,pid:1},
{name:'中价值',id:2,pid:1},
{name:'低价值',id:3,pid:1},
{name:'潜在高价值',id:4,pid:1},
]
},
{
name:'生命周期',
id:'2',
child:[
{name:'新客户',id:5,pid:2},
{name:'活跃',id:6,pid:2},
{name:'沉默',id:7,pid:2},
{name:'流失',id:8,pid:2},
]
},
{
name:'行为标签',
id:'3',
child:[
{name:'高频购买',id:9,pid:3},
{name:'大单',id:10,pid:3},
{name:'促销敏感',id:11,pid:3},
{name:'忠诚',id:12,pid:3},
]
},
{
name:'需求标签',
id:'4',
child:[
{name:'价格敏感',id:13,pid:4},
{name:'品质追求',id:14,pid:4},
{name:'服务',id:15,pid:4},
{name:'定制化',id:16,pid:4},
]
},
{
name:'来源标签',
id:'5',
child:[
{name:'线上',id:17,pid:5},
{name:'线下',id:18,pid:5},
{name:'推荐',id:19,pid:5},
{name:'合作伙伴',id:20,pid:5},
]
},
{
name:'风险标签',
id:'6',
child:[
{name:'高',id:21,pid:6},
{name:'中',id:22,pid:6},
{name:'低',id:23,pid:6},
]
},
{
name:'满意度标签',
id:'7',
child:[
{name:'高',id:24,pid:7},
{name:'中',id:25,pid:7},
{name:'低',id:26,pid:7},
]
},
{
name:'忠诚度标签',
id:'8',
child:[
{name:'高',id:27,pid:8},
{name:'中',id:28,pid:8},
{name:'低',id:29,pid:8},
]
}
]
} }
}, },
onLoad() { onLoad() {
@@ -354,6 +464,13 @@
close(val){ close(val){
this[val] = false this[val] = false
}, },
//标签点击
tagSelect(item) {
this.$set(this.activeMap, item.pid, item.id);
},
isActive(parentId, childId) {
return this.activeMap[parentId] === childId;
},
//提交保存 //提交保存
saveFn(){ saveFn(){
if(this.form.contacts==''){ if(this.form.contacts==''){
@@ -524,4 +641,36 @@
padding: 20rpx; padding: 20rpx;
color: #999; color: #999;
} }
// 标签弹框
.tag-list{
max-height: 900rpx;
margin-top: 20rpx;
.tags{
margin-top: 10px;
}
.name{
margin: 10px 0px;
}
.tagitem{
background: #ECF2FF;
border-radius: 8px;
color: #3471FF;
text-align: center;
padding: 5px 0px;
}
.row{
width: 100%;
}
.col4{
display: inline-block;
margin: 4px 3px;
width: 30%;
}
}
.tagactive{
background: #3471FF !important;
color: #fff !important;
}
</style> </style>
+47 -1
View File
@@ -27,6 +27,22 @@
<view class="btn" @click="editFn"><image src="/static/image/customer/edit.png" mode=""></image><text> {{$t('edtbtn')}}</text></view> <view class="btn" @click="editFn"><image src="/static/image/customer/edit.png" mode=""></image><text> {{$t('edtbtn')}}</text></view>
</view> </view>
</view> </view>
<view class="cells">
<u-collapse :border="false">
<u-collapse-item
title="标签"
name="Docs guide"
:border="false"
>
<view class="">
<view class="tags">潜在高价值</view>
<view class="tags">活跃客户</view>
<view class="tags">促销敏感</view>
<view class="tags">促销敏</view>
</view>
</u-collapse-item>
</u-collapse>
</view>
<view class="cell"> <view class="cell">
<view class="item">{{$t('customer.Cstomerfj')}}</view> <view class="item">{{$t('customer.Cstomerfj')}}</view>
<view class="right select" @click="showgrade = true"> <view class="right select" @click="showgrade = true">
@@ -267,6 +283,16 @@
</script> </script>
<style lang="scss"> <style lang="scss">
::v-deep .u-cell__body{
padding: 0px !important;
}
::v-deep .u-collapse-item__content__text{
padding: 10px 0px!important;
}
::v-deep .u-cell__title-text{
font-size: 14px;
}
.u-m-lr-10{ .u-m-lr-10{
margin: 0px 10px; margin: 0px 10px;
} }
@@ -290,11 +316,27 @@
position: absolute; position: absolute;
top: 2px; top: 2px;
} }
.cells{
margin-bottom: 10px;
background: #f6f6f6;
padding:13px 15px;
border-radius: 10px;
.tags{
display: inline-block;
margin: 4px 3px;
width: 31%;
background: #ECF2FF;
border-radius: 15px;
color: #3471FF;
text-align: center;
padding: 5px 0px;
}
}
.cell{ .cell{
position: relative; position: relative;
display: flex; display: flex;
justify-content:space-between; justify-content:space-between;
padding: 18px 20px; padding: 13px 20px;
align-items: center; align-items: center;
font-weight: 500; font-weight: 500;
.item{ .item{
@@ -315,6 +357,10 @@
position: relative; position: relative;
margin-right: 10px; margin-right: 10px;
} }
.tagname{
color: #726CFF;
font-size: 12px;
}
.content{ .content{
padding: 10px 15px; padding: 10px 15px;
background: #FFFFFF; background: #FFFFFF;
+1 -1
View File
@@ -62,7 +62,7 @@
</template> </template>
<view class="gjtime"> <view class="gjtime">
<view class="contents" v-for="(item, index) in datalist" :key="index"> <view class="contents" v-for="(item, index) in datalist" :key="index">
<view class="" @click="godetile(item)"> <view class="" >
<view class="cont"> <view class="cont">
<view class="title"> <view class="title">
<view class=""><text class="name">{{item.contacts}}</text></view> <view class=""><text class="name">{{item.contacts}}</text></view>
+89 -12
View File
@@ -4,11 +4,36 @@
backgroundColor="#fff" :statusBar="true" :title="$t('navbar.businesscard')"></uni-nav-bar> backgroundColor="#fff" :statusBar="true" :title="$t('navbar.businesscard')"></uni-nav-bar>
<view class="card"> <view class="card">
<view class="img_top" ref="poster" id="poster"> <view class="img_top" ref="poster" id="poster">
<view class="name"> <view class="name">
<view>刘亦菲</view> <view class="left">
<view>业务经理</view> <view class="title">
<view>13838225452</view> <view class="leftbg"></view>
</view> <view>刘亦菲</view>
</view>
<view class="ftitle">业务经理</view>
</view>
<view>
<image src="/static/image/mine/user.png" mode=""></image>
</view>
</view>
<view class="conts">
<view class="coles">
<image src="/static/image/mine/phone.png" mode=""></image>
<view class="">13838225452</view>
</view>
<view class="coles">
<image src="/static/image/mine/email.png" style="height:13px;" mode=""></image>
<view class="">17752584152@163.com</view>
</view>
<view class="coles">
<image src="/static/image/mine/addr.png" style="height:18px;width: 14px;" mode=""></image>
<view class="">13838225452</view>
</view>
</view>
<view class="code">
<image src="/static/image/mine/ewm.png" mode=""></image>
<text>微信</text>
</view>
<!-- <view class="code" :class=" activeImg === share_one ? 'code_one' : activeImg === share_two ? 'code_two' : activeImg === share_three ? 'code_three' : 'code_one'"> <!-- <view class="code" :class=" activeImg === share_one ? 'code_one' : activeImg === share_two ? 'code_two' : activeImg === share_three ? 'code_three' : 'code_one'">
<qrcode-vue :value="codeUrl" :size="70"></qrcode-vue> <qrcode-vue :value="codeUrl" :size="70"></qrcode-vue>
</view> --> </view> -->
@@ -16,7 +41,7 @@
</view> </view>
<view class="foot"> <view class="foot">
<button class="btn" @click="goDown">{{$t('submit')}}</button> <button class="btn" @click="goDown">{{$t('download')}}</button>
</view> </view>
</view> </view>
</template> </template>
@@ -97,9 +122,9 @@
}).then(canvas => { }).then(canvas => {
// canvas 其实就是我们所讲的res 的意思 返回报文的意思 // canvas 其实就是我们所讲的res 的意思 返回报文的意思
let baseImg = canvas.toDataURL('image/png') let baseImg = canvas.toDataURL('image/png')
uni.showModal({ uni.showModal ({
title: '下载名片', title: '下载名片',
content: '确定下载当前名片图至相册嘛', content: '确定下载当前名片图吗?',
success: function (res) { success: function (res) {
if (res.confirm) { if (res.confirm) {
that.downloadImage(baseImg, 'screenshot.png'); that.downloadImage(baseImg, 'screenshot.png');
@@ -126,11 +151,63 @@
position: relative; position: relative;
width:690rpx; width:690rpx;
height:1060rpx; height:1060rpx;
border-radius: 15px; padding-top: 60rpx;
.leftbg{
width: 10px;
height: 34px;
background: linear-gradient(to bottom, #3471FF, #BD67FF);
margin-right: 15px;
}
.name{ .name{
position: absolute; display: flex;
top: 20%; align-items: center;
left: 10%; justify-content: space-between;
flex: 1;
margin: 0px 25px 0px 0px;
.title{
color: #3C4169;
font-size: 28px;
font-weight: bold;
display: flex;
align-items: center;
}
.ftitle{
color: #222222;
font-size: 16px;
font-weight: bold;
margin-top: 20px;
}
image{
width: 100px;
height: 100px;
}
}
.conts{
padding: 15px 25px;
line-height: 32px;
margin-bottom: 20px;
.coles{
display: flex;
align-items: center;
font-size: 16px;
image{
width: 16px;
height: 16px;
margin-right: 5px;
}
}
}
.code{
background-color: rgba(255,255,255,50%);
border-radius: 10px;
text-align: center;
width: 50%;
margin: auto;
padding: 15px;
image{
width: 160px;
height: 160px;
}
} }
} }
.foot{ .foot{
Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B