Commit 3484a74f authored by IvyXia123's avatar IvyXia123

Merge branch 'dev'

parents 5cdc6d96 ddf5cef0
......@@ -272,7 +272,8 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"optional": true
},
"assign-symbols": {
"version": "1.0.0",
......@@ -1914,6 +1915,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"optional": true,
"requires": {
"delayed-stream": "~1.0.0"
}
......@@ -2678,7 +2680,8 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"optional": true
},
"depd": {
"version": "1.1.2",
......@@ -3410,7 +3413,8 @@
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"optional": true
},
"fast-deep-equal": {
"version": "1.1.0",
......@@ -3732,7 +3736,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
......@@ -3753,12 +3758,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
......@@ -3773,17 +3780,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
......@@ -3900,7 +3910,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
......@@ -3912,6 +3923,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
......@@ -3926,6 +3938,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
......@@ -3933,12 +3946,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
......@@ -3957,6 +3972,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
......@@ -4037,7 +4053,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
......@@ -4049,6 +4066,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
......@@ -4134,7 +4152,8 @@
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
......@@ -4170,6 +4189,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
......@@ -4189,6 +4209,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
......@@ -4232,12 +4253,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
......
......@@ -16,7 +16,7 @@
// 权限验证 动态路由
if (window.location.href.indexOf("login") < 0) {
let permission = this.$store.state.progressList;
console.log(this.$store.state);
// console.log(this.$store.state);
let menuList = [];
this.$router.options.routes[0].children = [];
let routerUserDetail = {
......
This diff is collapsed.
......@@ -38,7 +38,7 @@ export default {
};
},
mounted() {
console.log(this.menuList);
// console.log(this.menuList);
},
methods: {
changeMenuType: function() {
......
......@@ -12,35 +12,29 @@
<el-button size="mini" @click="editComment(row.id)">
新增话术记录
</el-button>
<el-dialog append-to-body :visible.sync="descDialog.show" title="沟通情况列表" width="75%">
<el-form label-width="90px">
<call-back :callbackAdd="true" :callbackObj="callbackObj"></call-back>
<!--<el-form label-width="90px">
<el-form-item>
<el-button style="float: right" type="primary" plain @click="editComment(descDialog.id)">添加沟通情况</el-button>
</el-form-item>
</el-form>
<el-table
:data="descDialog.descList"
style="width: 100%">
<el-table-column
label="用户" className="f-c" width="150">
<el-table :data="descDialog.descList">
<el-table-column label="用户" className="f-c" width="150">
<template slot-scope="scope" v-if="descDialog.user_info">
<img :src="descDialog.user_info.avatar" style="width: 40px;height: 40px;border-radius: 50px"> {{descDialog.user_info.nickname}}(ID:{{descDialog.user_info.user_id}})
</template>
</el-table-column>
<el-table-column
prop="desc"
label="沟通情况">
</el-table-column>
<el-table-column
prop="type"
label="类型" width="80px">
<el-table-column prop="desc" label="沟通情况"></el-table-column>
<el-table-column prop="type" label="类型" width="80px">
<template slot-scope="scope">
{{scope.row.type === 0 ? '备注' : scope.row.type === 1 ? '沟通话术' : '召回话术'}}
</template>
</el-table-column>
<el-table-column
prop="reply_content"
label="用户回复">
<el-table-column prop="reply_content" label="用户回复">
<template slot-scope="scope">
<div v-if="scope.row.reply_content">
{{scope.row.reply_content}}
......@@ -51,17 +45,13 @@
</div>
</template>
</el-table-column>
<el-table-column
prop="operator"
label="联系人">
</el-table-column>
<el-table-column
prop="created_at"
label="记录事件">
</el-table-column>
</el-table>
<el-table-column prop="operator" label="联系人"></el-table-column>
<el-table-column prop="created_at" label="记录事件"></el-table-column>
</el-table>-->
</el-dialog>
<el-dialog append-to-body :visible.sync="newDialog.show" center title="添加沟通情况">
<!--<el-dialog append-to-body :visible.sync="newDialog.show" center title="添加沟通情况">
<el-form label-width="120px" size="mini">
<el-form-item label="类型" v-if="typeFlag">
<el-select v-model="newDialog.type" placeholder="类型">
......@@ -87,22 +77,29 @@
<el-button @click="newDialog.show = false">取 消</el-button>
<el-button type="primary" @click="submitDesc()">确 定</el-button>
</span>
</el-dialog>
</el-dialog>-->
</div>
</template>
<script>
import {addPeriodsClassUserDescApi,getUserDescListApi,editUserReplyApi} from "../../service/api";
import CallBack from '@/components/callBack/index';
export default {
name: "teacherDesc",
props:[
'row',
'descType',
'typeFlag'
'typeFlag',
'teacherId'
],
data(){
return {
callbackObj: {
id: '',
detail: {}
},
descDialog:{
show:false,
id:'',
......@@ -119,6 +116,7 @@
}
}
},
components: {CallBack},
methods:{
subReply(data){
let json = {}
......@@ -142,10 +140,17 @@
nickname:data.nickname,
user_id:data.user_id,
};
this.getUserDescList()
// this.getUserDescList();
this.callbackObj.id = data.user_id;
this.callbackObj.teacher_id = this.teacherId;
this.callbackObj.detail.birthday = data.birthday;
this.callbackObj.detail.user_id = data.user_id;
this.callbackObj.detail.nickname = data.nickname;
this.callbackObj.detail.mobile = data.mobile;
this.callbackObj.detail.baby_name = data.baby_name;
},
getUserDescList(){
getUserDescListApi(this.row.id,{limit:1000}).then(res=>{
getUserDescListApi(this.row.id,{limit:1000}).then(res => {
this.descDialog.descList = res.list
})
},
......
......@@ -432,7 +432,7 @@
color: #666;
}
</style>
<style>
<style lang="less" scoped>
.disabled .el-upload--picture-card {
display: none !important;
}
......
......@@ -571,6 +571,9 @@
goToTeacherDetail(row){
// this.$router.push('/teacher/'+ row.id);
this.dialogDetail.id = row.id;
this.dialogDetail.alias = row.alias;
this.dialogDetail.name = row.name;
this.dialogDetail.adviser = row.adviser;
this.dialogDetail.show = true
}
......
This diff is collapsed.
......@@ -71,6 +71,9 @@
</el-card>
</div>
<el-tabs type="border-card" v-model="tabs">
<!--<el-tab-pane label="客户管理" name="customer">
<customerDetail :customerObj="customerObj"></customerDetail>
</el-tab-pane>-->
<el-tab-pane label="今日任务" name="task">
<task :parentDetail="parentDetail"></task>
</el-tab-pane>
......@@ -505,6 +508,7 @@
import AddressArray from '../framework/address-picker/addr'
import task from './task'
import page from '../framework/page'
// import customerDetail from './customer'
import sourceDialog from './sourceDialog'
import couponDialog from './couponDialog'
import refundDetail from './refundDetail'
......@@ -524,7 +528,8 @@
chooseGoodDialog,
couponDialog,
refundDetail,
sourceDialog
sourceDialog,
// customerDetail
},
data() {
let nowDate = new Date();
......@@ -581,6 +586,11 @@
total: 0,
limit: 10,
nowPage: 1,
customerObj: {
alias: '',
name: '',
adviser: ''
},
userObj: {
classId: '',
title: '',
......@@ -1049,7 +1059,11 @@
return studentSource[val]
}
},
created() {
this.customerObj.alias = this.parentDetail ? this.parentDetail.alias : this.$route.params.alias;
this.customerObj.name = this.parentDetail ? this.parentDetail.name : this.$route.params.name;
this.customerObj.adviser = this.parentDetail ? this.parentDetail.adviser : this.$route.params.adviser;
},
mounted() {
this.id = this.parentDetail ? this.parentDetail.id : this.$route.params.id;
this.getTask4();
......
<template>
<div id="replayed">
<el-row :gutter="20">
<el-col :span="24">
<el-card>
<div slot="header" class="clearfix">
<span style="font-size: 18px;font-weight: bold;padding-right: 20px;">待回访日历</span>
<el-button size="mini" type="primary">刷新</el-button> <!-- @click="getData" -->
</div>
<div class="list-yi">
<div class="list-content">
<div></div>
<div>2</div>
<div>3</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script type="text/ecmascript-6">
import {
getVisitcalendarApi
} from "../../service/api";
export default {
name: '',
data() {
return {
infoData: [],
infoLoading: true,
timer: []
}
},
props: {
customerObj: {
type: Object,
default() {
return {}
}
},
},
mounted() {
console.log(this.customerObj)
this.getData()
},
methods: {
getData() {
getVisitcalendarApi(this.customerObj.id).then(res => {
// this.timer = res.time
this.infoData = res;
console.log(res);
console.log(Object.keys(res.visit_count))
console.log(Object.values(res.visit_count))
console.log(Object.values(res.weekday))
console.log(Object.keys(res.weekday))
Object.keys(res.weekday).map(item => {
cosnole.log(item)
})
})
}
}
}
</script>
<style lang="less" type="text/less">
.list-yi {
overflow: hidden;
}
.list-content {
padding: 0 20px 20px;
text-align: center;
float: left;
}
</style>
<template>
<div style="font-size: 14px">
<el-row :gutter="20">
<el-col :span="12">
<customerDetail style="padding-bottom: 20px;" :customerObj="parentDetail"></customerDetail>
</el-col>
<el-col :span="12">
<replayedDetail style="padding-bottom: 20px;" :customerObj="parentDetail"></replayedDetail>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<task1 :teacherId="id"></task1>
......@@ -123,7 +132,7 @@
min-width="260"
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="2" @onSuccess="refDesc3"></teacher-desc>
<teacher-desc :teacherId="id" :row="scope.row" :descType="2" @onSuccess="refDesc3"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......@@ -244,7 +253,7 @@
min-width="160"
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="1" @onSuccess="refDesc2"></teacher-desc>
<teacher-desc :teacherId="id" :row="scope.row" :descType="1" @onSuccess="refDesc2"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......@@ -336,7 +345,7 @@
prop='title'
label="期数标题">
</el-table-column>
<el-table-column
prop='user_id'
label="用户ID">
......@@ -356,7 +365,7 @@
<el-table-column
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="1" @onSuccess="searchPage"></teacher-desc>
<teacher-desc :teacherId="id" :row="scope.row" :descType="1" @onSuccess="searchPage"></teacher-desc>
</template>
</el-table-column>
</el-table>
......@@ -387,7 +396,7 @@
<el-table-column
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="1" @onSuccess="getTask5"></teacher-desc>
<teacher-desc :teacherId="id" :row="scope.row" :descType="1" @onSuccess="getTask5"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......@@ -450,9 +459,11 @@
import task2 from './task2'
import task3 from './task3'
import sourceByDateDialog from './sourceByDateDialog'
import customerDetail from './customer'
import replayedDetail from './replayed'
export default {
name: "task",
components: {teacherDesc,task1,task2,task3,userWeight,sourceByDateDialog},
components: {teacherDesc,task1,task2,task3,userWeight,sourceByDateDialog,customerDetail,replayedDetail},
props:[
'parentDetail'
],
......@@ -632,10 +643,10 @@
if(this.searchWatch.periods_id==0&&res.periods_result&&res.periods_result.length){
this.prePeriods = res.periods_result
// if(res.periods_result&&res.periods_result.length){
// }
}
})
},
showSourceByDate(row){
......@@ -659,7 +670,7 @@
}
}
this.$refs.sourceByDateDialogDom.dialogShow = true
//
//
},
allDesc2(){
if(this.selectedTask2.length < 1){
......@@ -1036,6 +1047,7 @@
}
},
mounted(){
console.log(this.parentDetail)
this.initPage()
}
}
......
<template>
<div>
<el-row :gutter="20">
<el-row v-show="teacherShow != 5" :gutter="20">
<el-col :span="16">
<el-card class="box-card">
<div slot="header" class="clearfix">
......@@ -27,8 +27,7 @@
class-name="hightLight"
prop="need_add_teacher_num"
label="需加好友人数"
align="center"
>
align="center">
<template slot-scope="scope">
<el-button
type="text"
......@@ -152,7 +151,7 @@
</el-card>
</el-col>
</el-row>
<el-dialog append-to-body :visible.sync="task7Show" title="外部渠道待激活列表" width="85%">
<el-dialog v-show="teacherShow != 5" append-to-body :visible.sync="task7Show" title="外部渠道待激活列表" width="85%">
<el-button @click="allDesc7()" size="mini" type="success">批量添加备注</el-button>
<el-table
border
......@@ -195,7 +194,7 @@
</el-table>
<page :total="total7" :limit="limit" @pageChange="onPageChange7" @sizeChange="onSizeChange7"/>
</el-dialog>
<el-dialog append-to-body :visible.sync="task6Show" title="外部订单待激活列表" width="85%">
<el-dialog v-show="teacherShow != 5" append-to-body :visible.sync="task6Show" title="外部订单待激活列表" width="85%">
<el-button @click="allDesc6()" size="mini" type="success">批量添加备注</el-button>
<el-table
border
......@@ -253,7 +252,7 @@
<page :total="total" :limit="limit" @pageChange="onPageChange6" @sizeChange="onSizeChange6"/>
</el-dialog>
<el-dialog append-to-body :visible.sync="task7Show2" title="外部渠道已激活列表" width="85%">
<el-dialog v-show="teacherShow != 5" append-to-body :visible.sync="task7Show2" title="外部渠道已激活列表" width="85%">
<el-button @click="allDesc7()" size="mini" type="success">批量添加备注</el-button>
<el-table
border
......@@ -287,7 +286,7 @@
@sizeChange="onSizeChange7"
/>
</el-dialog>
<el-dialog append-to-body :visible.sync="task6Show2" title="外部订单已激活列表" width="85%">
<el-dialog v-show="teacherShow != 5" append-to-body :visible.sync="task6Show2" title="外部订单已激活列表" width="85%">
<el-button @click="allDesc6()" size="mini" type="success">批量添加备注</el-button>
<el-table
border
......@@ -385,12 +384,13 @@
</el-table-column>
<el-table-column prop="desc" label="沟通情况" align="center">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="2" @onSuccess="refDesc1"></teacher-desc>
<teacher-desc :teacherId="teacherId" :row="scope.row" :descType="2" @onSuccess="refDesc1"></teacher-desc>
</template>
</el-table-column>
<el-table-column prop="created_at" label="入课时间" min-width="140px" align="center" sortable></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
......@@ -412,7 +412,7 @@ import { USERSTATUS } from "../../util/wordbook";
export default {
name: "task1",
components: { teacherDesc, page },
props: ["teacherId"],
props: ["teacherId", "teacherShow"],
data() {
return {
false:false,
......@@ -673,7 +673,6 @@ export default {
this.task1List = res;
res.forEach(i => {
if (i.cur_date === this.task1Detail.cur_date) {
console.log(this.task1Detail);
this.task1Detail.list =
this.task1Detail.indexOf("未通过用户列表") < -1
? i.done_detail
......@@ -692,6 +691,7 @@ export default {
});
},
showTask1Detail(data, type) {
console.log(data)
this.task1Detail = {
show: true,
list: type ? data.done_detail : data.need_add_detail,
......
......@@ -48,7 +48,7 @@
min-width="160"
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="1" @onSuccess="refDesc2"></teacher-desc>
<teacher-desc :teacherId="teacherId" :row="scope.row" :descType="1" @onSuccess="refDesc2"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......
......@@ -108,7 +108,7 @@
min-width="160"
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="2" @onSuccess="refDesc3"></teacher-desc>
<teacher-desc :teacherId="teacherId" :row="scope.row" :descType="2" @onSuccess="refDesc3"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......@@ -165,7 +165,7 @@
min-width="160"
label="沟通情况">
<template slot-scope="scope">
<teacher-desc :row="scope.row" :descType="2" @onSuccess="refDesc4"></teacher-desc>
<teacher-desc :teacherId="teacherId" :row="scope.row" :descType="2" @onSuccess="refDesc4"></teacher-desc>
</template>
</el-table-column>
<el-table-column
......
<template>
<div class="user" v-loading="loading">
<el-form ref="searchFrom" :model="searchFrom" label-width="80px" inline>
<el-form-item label="ID">
<el-input v-model="searchFrom.userId"></el-input>
</el-form-item>
<el-form-item label="昵称">
<el-input v-model="searchFrom.nickName"></el-input>
</el-form-item>
<el-form-item label="电话">
<el-input v-model="searchFrom.mobile"></el-input>
</el-form-item>
<el-form-item label="等级">
<el-input v-model="searchFrom.level"></el-input>
</el-form-item>
<!--<el-form-item label="标签">
<el-cascader
style="width: 320px" placeholder="选择标签" clearable @change="tagChange"
:options="options" :props="{ multiple: true, checkStrictly: true }"></el-cascader>
</el-form-item>-->
<el-form-item>
<div class="flexRow">
<el-button type="primary" plain @click="getUser">搜索</el-button>
<!--<el-button type="success" plain @click="syncUser">同步最新数据</el-button>-->
</div>
</el-form-item>
</el-form>
<div class="admin-refresh" v-loading="loading">
<div class="section-search">
<el-form ref="searchFrom" :model="searchFrom" label-width="80px" inline>
<el-form-item>
<el-input v-model="searchFrom.userId" placeholder="ID" clearable @change="getUser"></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="searchFrom.nickName" placeholder="昵称" clearable @change="getUser"></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="searchFrom.mobile" placeholder="电话" clearable @change="getUser"></el-input>
</el-form-item>
<el-form-item>
<el-input v-model="searchFrom.level" placeholder="等级" clearable @change="getUser"></el-input>
</el-form-item>
<!--<el-form-item label="标签">
<el-cascader
style="width: 320px" placeholder="选择标签" clearable @change="tagChange"
:options="options" :props="{ multiple: true, checkStrictly: true }"></el-cascader>
</el-form-item>-->
<el-form-item>
<div class="flexRow">
<el-button type="primary" plain @click="getUser">搜索</el-button>
<!--<el-button type="success" plain @click="syncUser">同步最新数据</el-button>-->
</div>
</el-form-item>
</el-form>
</div>
<el-table
:data="userList"
style="width: 100%">
......@@ -158,7 +161,8 @@
teacherDialog
},
mounted() {
this.getUser()
this.$route.query.id ? this.searchFrom.userId = this.$route.query.id : '';
this.getUser();
},
methods: {
......
......@@ -104,7 +104,7 @@ import AddressArray from '../framework/address-picker/addr'
vueAddress
},
mounted(){
console.log(this.dialogObj)
// console.log(this.dialogObj)
}
}
</script>
......
<template>
<div class="user">
<div class="box">
<el-card class="user-card">
<div class="card-content">
<div class="text item">
<a :href="detail.avatar" target="_blank">
<img :src="detail.avatar"/>
</a>
</div>
<div class="text item">
<div>
<label>用户:</label>{{detail.nickname}} (ID: {{id}})
</div>
<div>
<label>tel:</label>{{detail.mobile}}
</div>
<div>
<label>生日:</label>{{detail.birthday}}
</div>
<div>
<label>注册时间:</label>{{detail.created_at}}
<div>
<el-row :gutter="20" style="margin-bottom: 20px;">
<el-col :span="12">
<el-card class="user-card">
<div class="card-content">
<div class="text item">
<a :href="detail.avatar" target="_blank">
<img :src="detail.avatar"/>
</a>
</div>
<div>
<label>最后登录:</label>{{detail.last_login_at}}
<div class="text item">
<div>
<label>用户:</label>{{detail.nickname}} (ID: {{id}})
</div>
<div>
<label>tel:</label>{{detail.mobile}}
</div>
<div>
<label>生日:</label>{{detail.birthday}}
</div>
<div>
<label>注册时间:</label>{{detail.created_at}}
</div>
<div>
<label>最后登录:</label>{{detail.last_login_at}}
</div>
</div>
</div>
</div>
</el-card>
<el-card class="user-card">
<div class="card-content" v-if="subDetail.nickname">
<div class="text item">
<a :href="subDetail.avatar" target="_blank">
<img :src="subDetail.avatar"/>
</a>
</div>
<div class="text item">
<div>
<label>用户:</label>{{subDetail.nickname}} (ID: {{subDetail.user_id}})
</div>
<div>
<label>tel:</label>{{subDetail.mobile}}
</el-card>
</el-col>
<el-col :span="12">
<el-card class="user-card">
<div style="min-height: 150px">
<div class="card-content" v-if="subDetail.nickname">
<div class="text item">
<a :href="subDetail.avatar" target="_blank">
<img :src="subDetail.avatar"/>
</a>
</div>
<div class="text item">
<div>
<label>用户:</label>{{subDetail.nickname}} (ID: {{subDetail.user_id}})
</div>
<div>
<label>tel:</label>{{subDetail.mobile}}
</div>
</div>
</div>
<p class="fl" v-if="!subDetail.nickname" style="clear:both;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(暂无子账户)</p>
<p class="fl" v-if="subDetail.nickname" style="clear:both;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(子账户)</p>
</div>
</div>
<p class="fl" v-if="!subDetail.nickname" style="clear:both;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(暂无子账户)</p>
<p class="fl" v-if="subDetail.nickname" style="clear:both;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(子账户)</p>
</el-card>
</div>
</el-card>
</el-col>
</el-row>
<!--<el-tabs type="border-card" v-model="tabs">-->
<el-tabs type="border-card" v-model="tabs">
<el-tab-pane label="回访信息" name="callback">
<call-back :callbackObj="callbackObj"></call-back>
</el-tab-pane>
<el-tab-pane label="期数列表" name="periods">
<el-table @expand-change="changeRow" :data="periodList">
<el-table-column type="expand">
......@@ -513,6 +525,7 @@
import {INVITETYPE, ORDERSTATUS, BUYTYPE, USERSTATUSFORMATER} from "../../util/wordbook";
import teacherDialog from './dialog'
import UserList from '../class/userList'
import CallBack from '@/components/callBack/index'
import sourceByDateDialog from '../teacherDetail/sourceByDateDialog'
import AddressArray from "../framework/address-picker/addr";
......@@ -520,6 +533,10 @@
name: "index",
data() {
return {
callbackObj: {
id: '',
detail: {}
},
userList: [],
yunjiList: [],
addressList: [],
......@@ -532,7 +549,8 @@
show: false,
out_trade_no: ''
},
tabs: 'periods',
//tabs: 'periods',
tabs: 'callback',
couponDetail: {
show: false,
order_coupon_id: ''
......@@ -621,13 +639,17 @@
sourceDialog,
couponDialog,
sourceByDateDialog,
addressDialogC
addressDialogC,
CallBack
},
props: [
'parentDetail'
],
mounted() {
created() {
this.id = this.parentDetail ? this.parentDetail.id : this.$route.params.id;
this.callbackObj.id = this.id;
},
mounted() {
this.getDetail();
},
watch: {
......@@ -862,6 +884,7 @@
if (!this.id) return;
getUserDetailApi(this.id).then(res => {
this.detail = res;
this.callbackObj.detail = res; // 用户的所有数据
if (res.periods_list) {
this.periodList = res.periods_list
}
......@@ -1034,9 +1057,9 @@
}
.user-card {
margin: 10px;
width: 600px;
padding: 20px;
/*margin: 10px;*/
/*width: 600px;*/
/*padding: 20px;*/
// display: flex;
.text.item {
line-height: 30px;
......
......@@ -69,7 +69,7 @@ router.beforeEach((to,from,next)=> {
}
}
store.state.nowTab = to.name;
console.log(to)
// console.log(to)
if(to.matched.length > 1 && to.name !== 'first'){
let thisMenu;
for (let i = 0 ; i < store.state.menuList.length ; i ++ ){
......@@ -101,7 +101,7 @@ router.beforeEach((to,from,next)=> {
store.dispatch('classManageUnlimited',to.meta.classManageUnlimited)
store.dispatch('classTakeUnlimited',to.meta.classTakeUnlimited)
store.dispatch('exportFinish',to.meta.exportFinish)
console.log(to.meta)
// console.log(to.meta)
if(to.name==='userDetail'){
let list = JSON.parse(localStorage.getItem('permission'))
let readonly = list.find(i=>{
......
......@@ -62,6 +62,27 @@ const postUserTransferUrl = `${_baseUrl}api/admin/user/data/transfer`;
export const postUserTransferApi = function (json) {
return Vue.prototype.$post(postUserTransferUrl, json)
};
// 获取回访信息
export const getCallBackApi = function (json) {
console.log(json, 9001)
return Vue.prototype.$fetch(`${_baseUrl}api/admin/user/visit/${json.user_id}`, json)
};
// 添加回访信息
export const postCallBackApi = function (json) {
return Vue.prototype.$post(`${_baseUrl}api/admin/user/visit/${json.user_id}/${json.teacher_id}`, json)
};
// 获取用户标签
export const getUserTagApi = function (id) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/user/label/${id}`)
};
// 用户添加标签
export const postUserTagApi = function (json) {
return Vue.prototype.$post(`${_baseUrl}api/admin/user/bind/label`, json)
};
// 删除用户标签
export const delUserTagApi = function (id) {
return Vue.prototype.$del(`${_baseUrl}api/admin/user/label/${id}`)
};
//获取教师列表
const getTeacherListUrl = `${_baseUrl}api/admin/teacher/list`;
export const getTeacherListApi = function (json) {
......@@ -95,6 +116,36 @@ export const postTransferTeacherApi = function (json) {
export const getRealTimeDataApi = function (data) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/todaydata/${data}`)
};
// 通话次数
export const getPhoneRecordApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/phonerecord/${data}`, json)
};
// 有效沟通统计
export const getValidchatApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/validchat/${data}`, json)
};
//全部好友
export const getFriendlistApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/friendlist/${data}`, json)
};
//添加好友
export const getAddfriendlistApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/addfriendlist/${data}`, json)
};
//聊天记录
export const getChatrecordApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/chatrecord/${data}`, json)
};
//待会访日历接口
export const getVisitcalendarApi = function (data, json) {
return Vue.prototype.$fetch(`${_baseUrl}api/admin/teacher/visitcalendar/${data}`, json)
};
//获取课程列表
const getLessonUrl = `${_baseUrl}api/admin/course/list`;
export const getLessonApi = function (json) {
......@@ -1064,7 +1115,7 @@ const updateContactUrl = `/api/admin/other/order/user/status`;
export const updateContactApi = function (json) {
return Vue.prototype.$put(`${updateContactUrl}`, json)
};
// 外部渠道批量指派订单老师
// 外部渠道批量指派订单老师api/admin/user/label/{id}
const adsTeacherUrl = `/api/admin/ads/teacher/`;
export const adsTeacherApi = function (id, json) {
return Vue.prototype.$put(`${adsTeacherUrl}${id}`, json)
......@@ -1275,7 +1326,7 @@ const getSourceConversionListUrl = `${_baseUrl}api/admin/class/conversion/source
export const getSourceConversionListApi = function (json) {
return Vue.prototype.$fetch(getSourceConversionListUrl, json)
};
//
//
//各期数班主任转化
const getMarketEnrollmentConversionListUrl = `${_baseUrl}api/admin/periods/source/conversion/list`;
export const getMarketEnrollmentConversionListApi = function (json) {
......
......@@ -79,8 +79,7 @@ axios.interceptors.request.use(
if(process.env.NODE_ENV === 'development' ){
config.data.special_token="changchangenglish";
}
console.log(54)
console.log(JSON.stringify(json2))
// console.log(JSON.stringify(json2))
config.data.param_token = md5(JSON.stringify(json2));
}
return config;
......@@ -238,6 +237,7 @@ export function fetch(url,params={}){
})
.catch(err => {
reject(err);
console.log(err);
let message = '请求失败!请检查网络';
if(err.response)message=err.response.data.message;
Vue.prototype.$msgbox({
......
/**
*
* @classDesc 核心js基类,提供全局可用api
* @namespace ZA
*/
const Za = {
/**
* 转换为字符
* @param v {object}
* @returns {string}
*/
toString: function (v) {
return Object.prototype.toString.apply(v);
},
/**
* 判断值是否已定义
* @param v {*}
* @returns {boolean}
*/
isDefined: function (v) {
return typeof v !== 'undefined';
},
/**
* 是否为空
* @param v {*} 值
* @param allowBlank {boolean} 是否允许空
* @returns {boolean|*}
*/
isEmpty: function (v, allowBlank) {
return v === null || v === undefined
|| String(v).toUpperCase() === 'NULL'
|| ((Za.isArray(v) && !v.length))
|| (!allowBlank ? v === '' : false)
|| (Za.isObject(v) && JSON.stringify(v) === '{}')
},
/**
* 是否是数组
* @param v
* @returns {boolean}
*/
isArray: function (v) {
return Za.toString(v) === '[object Array]';
},
/**
* 是否是日期
* @param v
* @returns {boolean}
*/
isDate: function (v) {
return Za.toString(v) === '[object Date]';
},
/**
* 是否是对象
* @param v
* @returns {boolean}
*/
isObject: function (v) {
return !!v && Za.toString(v) === '[object Object]';
},
/**
* 字符串是否是对象
* @param str
* @returns {boolean}
*/
isJSON(str) {
if (typeof str == 'string') {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
},
/**
* 是否是函数
* @param v
* @returns {boolean}
*/
isFunction: function (v) {
return Za.toString(v) === '[object Function]';
},
/**
* 是否是数值型
* @param v
* @returns {boolean}
*/
isNumber: function (v) {
return typeof v === 'number' && isFinite(v);
},
/**
* 是否是字符型
* @param v
* @returns {boolean}
*/
isString: function (v) {
return typeof v === 'string';
},
/**
* 是否是布尔型
* @param v
* @returns {boolean}
*/
isBoolean: function (v) {
return typeof v === 'boolean';
},
/**
* 是否是原始类型
* @param v
* @returns {*|boolean}
*/
isPrimitive: function (v) {
return Za.isString(v) || Za.isNumber(v) || Za.isBoolean(v);
},
/**
* 是否是URL
* @param v
* @returns {boolean}
*/
isUrl: function (v) {
return /(((^https?)|(^ftp)):\/\/((([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*)|(localhost|LOCALHOST|127.0.0.1))\/?)/i
.test(v);
},
/**
* 返回parameters参数 特指页面跳转间传递的参数
* @returns {*}
*/
getParameters: function () {
var params = sessionStorage.getItem("_parameters");
sessionStorage.removeItem("_parameters");
//params = Za.isEmpty(params) ? {} : params;
return Za.JsonEval(params);
},
/**
* 清空 页面间跳转的参数
*/
clearParameters: function () {
sessionStorage.removeItem("_parameters");
},
/**
* 查询当前日前几天的日期
* @param AddDayCount {int} 负数为前X天 正数为后X天
* @returns {string}
* @exaple
* Za.getDate(-6)
*/
getDate: function (AddDayCount) { //日期查询
var dd = new Date();
dd.setDate(dd.getDate() + AddDayCount + 1);
var y = dd.getYear() + 1900;
var m = (dd.getMonth() + 1) < 10 ? "0" + (dd.getMonth() + 1) : (dd.getMonth() + 1);
var d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate();
return y + "-" + m + "-" + d;
},
/**
* JSON对象转换为String
* @param json
* @constructor
*/
JsonToStr: function (json) {
return JSON.stringify(json);
},
/**
* String转换为JSON
* @param str
* @returns {Object}
* @constructor
*/
JsonEval: function (str) {
return eval("(" + str + ")");
//return JSON.parse(str);
},
};
export default Za
......@@ -83,6 +83,8 @@ import refueling1_title from '../assets/mould/refueling1/title.png'
import refueling2_next from '../assets/mould/refueling2/next.png'
import refueling2_back from '../assets/mould/refueling2/back.png'
import gou from '../assets/gou.png'
// 爸妈看一看
export const look1={
bg:look1_bg,
......@@ -194,4 +196,5 @@ export const refueling2={
title2:playTitle,
back:refueling2_back,
radio:refueling1_radio,
gou: gou
};
export default function addEmoji(string) {
function replaceAll(find, replace, str) {
return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
function escapeRegExp(str) {
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
var map = {
"[微笑]": "1.png",
"[撇嘴]": "2.png",
"[色]": "3.png",
"[发呆]": "4.png",
"[得意]": "5.png",
"[流泪]": "6.png",
"[害羞]": "7.png",
"[闭嘴]": "8.png",
"[睡]": "9.png",
"[大哭]": "10.png",
"[尴尬]": "11.png",
"[发怒]": "12.png",
"[调皮]": "13.png",
"[呲牙]": "14.png",
"[惊讶]": "15.png",
"[难过]": "16.png",
"[酷]": "17.png",
"[囧]": "18.png",
"[抓狂]": "19.png",
"[吐]": "20.png",
"[偷笑]": "21.png",
"[愉快]": "22.png",
"[白眼]": "23.png",
"[傲慢]": "24.png",
"[饥饿]": "25.png",
"[困]": "26.png",
"[惊恐]": "27.png",
"[流汗]": "28.png",
"[憨笑]": "29.png",
"[悠闲]": "30.png",
"[奋斗]": "31.png",
"[咒骂]": "32.png",
"[疑问]": "33.png",
"[嘘]": "34.png",
"[晕]": "35.png",
"[衰]": "37.png",
"[骷髅]": "38.png",
"[敲打]": "39.png",
"[再见]": "40.png",
"[擦汗]": "41.png",
"[抠鼻]": "42.png",
"[鼓掌]": "43.png",
"[糗大了]": "44.png",
"[坏笑]": "45.png",
"[左哼哼]": "46.png",
"[右哼哼]": "47.png",
"[哈欠]": "48.png",
"[鄙视]": "49.png",
"[委屈]": "50.png",
"[快哭了]": "51.png",
"[阴险]": "52.png",
"[亲亲]": "53.png",
"[吓]": "54.png",
"[可怜]": "55.png",
"[菜刀]": "56.png",
"[西瓜]": "57.png",
"[啤酒]": "58.png",
"[篮球]": "59.png",
"[乒乓]": "60.png",
"[咖啡]": "61.png",
"[饭]": "62.png",
"[猪头]": "63.png",
"[玫瑰]": "64.png",
"[凋谢]": "65.png",
"[嘴唇]": "66.png",
"[爱心]": "67.png",
"[心碎]": "68.png",
"[蛋糕]": "69.png",
"[闪电]": "70.png",
"[炸弹]": "71.png",
"[刀]": "72.png",
"[足球]": "73.png",
"[瓢虫]": "74.png",
"[便便]": "75.png",
"[月亮]": "76.png",
"[太阳]": "77.png",
"[礼物]": "78.png",
"[拥抱]": "79.png",
"[强]": "80.png",
"[弱]": "81.png",
"[握手]": "82.png",
"[胜利]": "83.png",
"[抱拳]": "84.png",
"[勾引]": "85.png",
"[拳头]": "86.png",
"[差劲]": "87.png",
"[爱你]": "88.png",
"[NO]": "89.png",
"[OK]": "90.png",
"[爱情]": "91.png",
"[飞吻]": "92.png",
"[跳跳]": "93.png",
"[发抖]": "94.png",
"[怄火]": "95.png",
"[转圈]": "96.png",
"[磕头]": "97.png",
"[回头]": "98.png",
"[跳绳]": "99.png",
"[投降]": "100.png",
"[激动]": "101.png",
"[乱舞]": "102.png",
"[献吻]": "103.png",
"[左太极]": "104.png",
"[右太极]": "105.png",
"[奸笑]": "106.png",
"[嘿哈]": "107.png",
"[捂脸]": "108.png",
"[机智]": "109.png",
"[茶]": "110.png",
"[红包]": "111.png",
"[蜡烛]": "113.png",
"[耶]": "114.png"
};
string = string.replace(/\n/g, "<br/>");
for (let key in map) {
if (string.indexOf(key) != -1) {
string = replaceAll(key, `<img src="/static/images/wechat/${map[key]}">`, string);
}
}
return string
}
......@@ -220,3 +220,51 @@ export const LogisticsStatus = {
2: '已签收',
3: '异常'
};
export const CALLBACK_METHOD = [{
label: '电话接通',
value: 1
}, {
label: '电话未接通',
value: 2
}, {
label: '微信沟通',
value: 3
}, {
label: '微信留言',
value: 4
}, {
label: '备注',
value: 5
}];
export const CALLBACK_TYPE = [{
label: '开课回访',
value: 1
}, {
label: '常规回访',
value: 2
}, {
label: '通知',
value: 3
}, {
label: '信息变更',
value: 4
}, {
label: '服务评价',
value: 5
}];
export const CALLBACK_INTENTION = [{
label: '低意向',
value: 1
}, {
label: '中意向',
value: 2
}, {
label: '高意向',
value: 3
}, {
label: '不跟踪',
value: 4
}];
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment