Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
admin-base
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
new-sing
admin-base
Commits
ddf5cef0
Commit
ddf5cef0
authored
Aug 22, 2019
by
IvyXia123
Browse files
Options
Browse Files
Download
Plain Diff
代码提交
parents
8832bcb4
b64254e1
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
1325 additions
and
253 deletions
+1325
-253
index.js
config/index.js
+14
-1
App.vue
src/App.vue
+7
-3
index.vue
src/components/callBack/index.vue
+424
-0
dialog.vue
src/components/disposable/dialog.vue
+117
-0
index.vue
src/components/disposable/index.vue
+329
-0
receiveInfoDialog.vue
src/components/disposable/receiveInfoDialog.vue
+72
-0
leftMenu.vue
src/components/framework/leftMenu.vue
+1
-1
teacherDesc.vue
src/components/framework/teacherDesc.vue
+35
-30
index.vue
src/components/logistics/index.vue
+25
-28
receiveInfoDialog.vue
src/components/logistics/receiveInfoDialog.vue
+4
-2
role.vue
src/components/system/role.vue
+1
-1
task.vue
src/components/teacherDetail/task.vue
+4
-4
task1.vue
src/components/teacherDetail/task1.vue
+1
-1
task2.vue
src/components/teacherDetail/task2.vue
+1
-1
task3.vue
src/components/teacherDetail/task3.vue
+2
-2
index.vue
src/components/user/index.vue
+31
-27
addressdialog.vue
src/components/userDetail/addressdialog.vue
+1
-1
index.vue
src/components/userDetail/index.vue
+72
-49
index.js
src/router/index.js
+2
-2
api.js
src/service/api.js
+30
-1
index.js
src/service/index.js
+2
-2
menuList.js
src/util/menuList.js
+14
-8
wordbook.js
src/util/wordbook.js
+136
-89
No files found.
config/index.js
View file @
ddf5cef0
...
...
@@ -4,6 +4,19 @@
const
path
=
require
(
'path'
);
function
getIP
()
{
var
interfaces
=
require
(
'os'
).
networkInterfaces
();
for
(
var
devName
in
interfaces
)
{
var
iface
=
interfaces
[
devName
];
for
(
var
i
=
0
;
i
<
iface
.
length
;
i
++
)
{
var
alias
=
iface
[
i
];
if
(
alias
.
family
===
'IPv4'
&&
alias
.
address
!==
'127.0.0.1'
&&
!
alias
.
internal
)
{
return
alias
.
address
;
}
}
}
}
module
.
exports
=
{
dev
:
{
// Paths
...
...
@@ -18,7 +31,7 @@ module.exports = {
}
},
// Various Dev Server settings
host
:
'localhost'
,
// can be overwritten by process.env.HOST
host
:
getIP
()
,
// can be overwritten by process.env.HOST
port
:
8080
,
// can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser
:
false
,
errorOverlay
:
true
,
...
...
src/App.vue
View file @
ddf5cef0
...
...
@@ -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
=
{
...
...
@@ -148,13 +148,17 @@
}
}
.el-form {
font-size: 0;
}
.el-form--inline, &.el-form--inline {
.el-form-item {
margin-right:
0
;
margin-right:
@gutterSize
;
margin-bottom: @gutterSize;
& + .el-form-item {
margin-left: @gutterSize;
//
margin-left: @gutterSize;
}
}
}
...
...
src/components/callBack/index.vue
0 → 100644
View file @
ddf5cef0
<!-- 回访信息 -->
<
template
>
<div
class=
"callback-container"
>
<div
class=
"callback-item"
style=
"margin-bottom: 15px;"
>
ID:
{{
callbackObj
.
detail
.
user_id
}}
 
用户昵称:
{{
callbackObj
.
detail
.
nickname
}}
 
宝宝名称:
{{
callbackObj
.
detail
.
baby_name
?
callbackObj
.
detail
.
baby_name
:
'-'
}}
 
宝宝生日:
{{
(
callbackObj
.
detail
.
birthday
==
'0000-00-00'
)
?
'-'
:
callbackObj
.
detail
.
birthday
}}
 
手机号:
{{
callbackObj
.
detail
.
mobile
?
callbackObj
.
detail
.
mobile
:
'-'
}}
 
</div>
<div
class=
"callback-item"
style=
"display: flex; margin-bottom: 15px; line-height: 32px;"
>
标签:
<span
class=
"callback-tag-wrapper"
v-if=
"tag.length"
>
<el-tag
:key=
"item.id"
:type=
"item.type==1 ? 'info' : ''"
v-for=
"item in tag"
>
{{
item
.
label_name
}}
</el-tag>
</span>
<el-button
type=
"warning"
size=
"small"
plain
@
click=
"dialogToggle"
>
编辑标签
</el-button>
</div>
<div
class=
"callback-item callback-input"
v-if=
"callbackObj.teacher_id && callbackAdd"
>
<el-form
size=
"small"
inline
>
<el-form-item
required
>
<el-select
v-model=
"add.method"
placeholder=
"回访方式"
style=
"width: 140px;"
>
<el-option
v-for=
"item in CALLBACK_METHOD"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item
required
>
<el-select
v-model=
"add.type"
placeholder=
"回访类型"
style=
"width: 140px;"
>
<el-option
v-for=
"item in CALLBACK_TYPE"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item
required
>
<el-select
v-model=
"add.intention"
placeholder=
"意向度"
style=
"width: 140px;"
>
<el-option
v-for=
"item in CALLBACK_INTENTION"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker
type=
"date"
placeholder=
"下次回访"
clearable
style=
"width: 140px;"
value-format=
"yyyy-MM-dd"
v-model=
"add.next_visit_at"
></el-date-picker>
</el-form-item>
<el-button
size=
"small"
type=
"success"
plain
@
click=
"addCallback"
>
添加回访信息
</el-button>
</el-form>
<el-input
type=
"textarea"
:rows=
"3"
placeholder=
"请输入回访内容"
v-model=
"add.desc"
></el-input>
</div>
<div
class=
"callback-list callback-item"
>
<ol
v-if=
"list.length"
>
<li
:key=
"item.id"
v-for=
"item in list"
>
<!--系统-->
<template
v-if=
"item.flag == 0"
>
<span
class=
"time"
>
{{
item
.
created_at
}}
</span>
<span
class=
"grey"
>
系统导入
</span>
<span
class=
"grey"
v-if=
"item.first_key"
:class=
"(item.desc.indexOf('支付')>-1) ? 'bold' : ''"
>
{{
item
.
first_key
}}
</span>
<span
class=
"info"
v-if=
"item.desc"
:class=
"(item.desc.indexOf('支付')>-1) ? 'red' : ''"
>
{{
item
.
desc
}}
</span>
</
template
>
<
template
v-else-if=
"item.flag == 1"
>
<span
class=
"time"
>
{{
item
.
created_at
}}
</span>
<span
class=
"bold dark"
v-if=
"item.staff_name"
>
{{
item
.
staff_name
}}
</span>
<span
class=
"bold dark"
v-if=
"item.teacher_name"
>
{{
item
.
teacher_name
}}
</span>
<span
class=
"dark"
>
{{
filterName
(
item
.
method
,
'CALLBACK_METHOD'
)
}}
</span>
<span
class=
"dark"
>
{{
filterName
(
item
.
intention
,
'CALLBACK_INTENTION'
)
}}
</span>
<span
class=
"green"
v-if=
"item.desc"
>
{{
item
.
desc
}}
</span>
<span
class=
"info"
>
下次回访:
{{
item
.
next_visit_at
==
'0000-00-00'
?
'-'
:
item
.
next_visit_at
}}
</span>
</
template
>
</li>
</ol>
<p
class=
"callback-list-text"
v-else
>
暂无回访数据
</p>
<page
:total=
"total"
:limit=
"limit"
@
pageChange=
"onPageChange"
@
sizeChange=
"onSizeChange"
/>
</div>
<el-dialog
:title=
"dialog.title"
append-to-body
:visible
.
sync=
"dialog.show"
width=
"800px"
>
<el-form
label-width=
"120px"
>
<el-form-item
label=
"已有标签:"
class=
"callback-tag-wrapper"
>
<
template
v-if=
"tag.length"
>
<el-tag
:key=
"item.id"
v-for=
"item in tag"
@
close=
"tagDel(item)"
:closable=
"item.type==1 ? false : true"
:type=
"item.type==1 ? 'info' : ''"
>
{{
item
.
label_name
}}
</el-tag>
</
template
>
<
template
v-else
>
暂无
</
template
>
</el-form-item>
<el-form-item
label=
"添加标签:"
required
>
<el-cascader
ref=
"tree"
v-model=
"tagSelectedTmp"
style=
"width: calc(100% - 90px)"
placeholder=
"选择标签"
clearable
@
change=
"tagChange"
:disabled=
"!treeDataOrigin.length"
:options=
"treeDataOrigin"
:props=
"{ value: 'objString', label: 'name', multiple: false, checkStrictly: false }"
></el-cascader>
</el-form-item>
<el-form-item
label=
"已选标签备注:"
>
<div
v-if=
"!tagSelectedText"
style=
"color: #999;"
>
未选择标签
</div>
<div
v-else
v-html=
"tagSelectedText"
></div>
</el-form-item>
</el-form>
<span
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogToggle"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"dialogSave"
>
保存,添加下一个
</el-button>
</span>
</el-dialog>
</div>
</template>
<
script
>
import
{
CALLBACK_METHOD
,
CALLBACK_TYPE
,
CALLBACK_INTENTION
}
from
"@/util/wordbook"
;
import
{
getUserTagApi
,
getTagApi
,
getCallBackApi
,
postCallBackApi
,
postUserTagApi
,
delUserTagApi
}
from
"@/service/api"
;
import
page
from
'@/components/framework/page'
export
default
{
name
:
"CallBack"
,
components
:
{
page
},
props
:
{
callbackObj
:
{
type
:
Object
,
default
:
()
=>
{}
},
callbackAdd
:
{
type
:
Boolean
,
default
:
false
}
},
data
()
{
return
{
CALLBACK_METHOD
:
CALLBACK_METHOD
,
CALLBACK_TYPE
:
CALLBACK_TYPE
,
CALLBACK_INTENTION
:
CALLBACK_INTENTION
,
tag
:
[],
treeDataOrigin
:
[],
tagSelected
:
[],
tagSelectedTmp
:
[],
tagSelectedText
:
''
,
list
:
[],
total
:
0
,
nowPage
:
1
,
limit
:
50
,
textarea
:
''
,
add
:
{
method
:
''
,
type
:
''
,
intention
:
''
,
next_visit_at
:
''
,
desc
:
''
},
dialog
:
{
title
:
''
,
show
:
false
,
form
:
{
id
:
''
,
name
:
''
,
mobile
:
''
,
id_card
:
''
,
type
:
''
,
in_at
:
''
,
over_at
:
''
,
rules
:
{
name
:
[{
required
:
true
,
message
:
'请输入'
,
trigger
:
'blur'
}],
mobile
:
[{
required
:
true
,
message
:
'请输入'
,
trigger
:
'blur'
}],
id_card
:
[{
required
:
true
,
message
:
'请输入'
,
trigger
:
'blur'
}],
type
:
[{
required
:
true
,
message
:
'请选择'
,
trigger
:
'change'
}],
in_at
:
[{
required
:
true
,
message
:
'请选择'
,
trigger
:
'change'
}],
},
}
},
}
},
created
()
{
},
mounted
()
{
this
.
getTag
();
this
.
getData
();
},
methods
:
{
filterName
(
string
,
type
)
{
return
this
[
type
].
find
(
i
=>
{
return
i
.
value
==
string
}).
label
},
tagDel
(
item
)
{
this
.
$confirm
(
`是否删除标签 <br>
${
item
.
label_name
}
`
,
'提示'
,
{
dangerouslyUseHTMLString
:
true
,
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
delUserTagApi
(
item
.
id
).
then
(
res
=>
{
this
.
$message
({
type
:
'success'
,
message
:
'标签删除成功!'
});
this
.
getTag
();
})
})
},
dialogToggle
()
{
this
.
dialog
.
show
=
!
this
.
dialog
.
show
;
if
(
!
this
.
treeDataOrigin
.
length
)
{
this
.
getTagTree
();
}
if
(
!
this
.
dialog
.
show
)
{
this
.
dialogReset
();
}
},
dialogReset
()
{
this
.
tagSelected
=
[];
this
.
tagSelectedTmp
=
[];
this
.
tagSelectedText
=
''
;
},
dialogSave
()
{
if
(
!
this
.
tagSelected
.
length
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请选择标签!'
});
return
}
var
json
=
{
user_id
:
this
.
callbackObj
.
id
,
type
:
0
,
first_label_id
:
this
.
tagSelected
[
0
]
};
this
.
tagSelected
[
1
]
?
json
.
second_label_id
=
this
.
tagSelected
[
1
]
:
''
;
this
.
tagSelected
[
2
]
?
json
.
third_label_id
=
this
.
tagSelected
[
2
]
:
''
;
postUserTagApi
(
json
).
then
(
res
=>
{
this
.
$message
({
type
:
'success'
,
message
:
'添加成功!'
});
this
.
getTag
();
this
.
dialogReset
();
})
},
tagChange
(
val
)
{
if
(
val
.
length
)
{
let
str
=
''
,
arr
=
[];
val
.
forEach
((
i
,
idx
)
=>
{
let
o
=
JSON
.
parse
(
i
);
arr
.
push
(
o
.
id
);
str
+=
`<p style="margin-top: 0;">
${
idx
+
1
}
.
${
o
.
name
}
:
${
o
.
cover
||
'-'
}
</p>`
})
this
.
tagSelectedText
=
str
;
this
.
tagSelected
=
arr
;
}
else
{
this
.
tagSelectedText
=
''
;
this
.
tagSelected
=
[];
}
},
getTagTree
()
{
// 获取标签
function
recursion
(
arr
)
{
if
(
Array
.
isArray
(
arr
)
&&
arr
.
length
)
{
arr
.
forEach
(
val
=>
{
val
.
objString
=
JSON
.
stringify
({
name
:
val
.
name
,
id
:
val
.
id
,
cover
:
val
.
cover
});
recursion
(
val
.
children
);
})
}
}
getTagApi
().
then
(
res
=>
{
recursion
(
res
);
this
.
treeDataOrigin
=
res
;
});
},
getTag
()
{
if
(
this
.
callbackObj
.
id
)
{
getUserTagApi
(
this
.
callbackObj
.
id
).
then
(
res
=>
{
this
.
tag
=
res
;
})
}
},
getData
()
{
let
json
=
{
limit
:
this
.
limit
,
page
:
this
.
nowPage
};
this
.
teacher_num
?
json
.
teacher_num
=
this
.
teacher_num
:
''
;
this
.
callbackObj
.
id
?
json
.
user_id
=
this
.
callbackObj
.
id
:
''
;
console
.
log
(
json
,
9000
)
getCallBackApi
(
json
).
then
(
res
=>
{
this
.
list
=
res
.
page_data
;
this
.
total
=
res
.
total_page
})
},
callbackReset
()
{
this
.
add
.
method
=
''
;
this
.
add
.
type
=
''
;
this
.
add
.
intention
=
''
;
this
.
add
.
next_visit_at
=
''
;
this
.
add
.
desc
=
''
;
},
addCallback
()
{
if
(
!
this
.
add
.
method
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请选择回访方式'
});
return
}
if
(
!
this
.
add
.
type
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请选择回访类型'
});
return
}
if
(
!
this
.
add
.
intention
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请选择意向度'
});
return
}
let
json
=
{
user_id
:
this
.
callbackObj
.
id
,
//teacher_id: this.callbackObj.teacher_id, // TODO
teacher_id
:
84
,
// TODO
method
:
this
.
add
.
method
,
type
:
this
.
add
.
type
,
intention
:
this
.
add
.
intention
,
}
this
.
add
.
next_visit_at
?
json
.
next_visit_at
=
this
.
add
.
next_visit_at
:
''
;
this
.
add
.
desc
?
json
.
desc
=
this
.
add
.
desc
:
''
;
postCallBackApi
(
json
).
then
(
res
=>
{
this
.
$message
({
type
:
'success'
,
message
:
'回访添加成功'
});
this
.
callbackReset
();
this
.
getData
();
})
},
onPageChange
(
val
)
{
this
.
nowPage
=
val
;
this
.
getData
()
},
onSizeChange
(
val
)
{
this
.
limit
=
val
;
this
.
nowPage
=
1
;
this
.
getData
()
},
}
}
</
script
>
<
style
lang=
"less"
>
.callback-container {
.el-divider--horizontal {
margin: 20px 0;
}
}
.callback-item {
margin-bottom: 15px;
padding: 15px;
background-color: rgba(245, 247, 250, 0.65);
border: solid 1px rgba(220, 223, 230, 0.5);
border-radius: 2px;
&:last-child {
margin-bottom: 0;
}
}
.callback-tag-wrapper {
.el-tag {
margin-right: 10px;
}
}
.callback-list {
ol {
margin: 0 0 10px;
padding: 0;
list-style: none;
}
.callback-list-text {
text-align: center;
line-height: 32px;
}
li {
/*display: flex;*/
padding: 2px 0;
line-height: 24px;
font-size: 14px;
span {
/*display: inline-block;*/
margin-right: 12px;
&.time {
font-family: monospace;
font-size: 13px;
}
&.grey {
color: #555;
}
&.dark {
color: #333;
}
&.bold {
font-weight: bold;
}
&.info {
font-size: 13px;
color: #888;
}
&.green {
color: #33CC66;
}
&.red {
color: red;
}
}
}
}
.callback-input {
font-size: 0;
.el-form-item {
margin-right: 10px;
margin-bottom: 10px;
}
.is-required .el-select {
display: flex;
&:before {
content: '*';
color: #F56C6C;
margin-top: -6px;
margin-right: 4px;
}
}
}
</
style
>
src/components/disposable/dialog.vue
0 → 100644
View file @
ddf5cef0
<
template
>
<el-dialog
title=
"编辑"
append-to-body
:visible
.
sync=
"dialogObj.show"
width=
"800px"
>
<el-form
label-width=
"100px"
style=
"margin-top: 20px;"
>
<el-form-item
label=
"收货人"
required
>
<el-input
v-model=
"form.receive_name"
type=
"text"
></el-input>
</el-form-item>
<el-form-item
label=
"收货手机号"
required
>
<el-input
v-model=
"form.receive_mobile"
type=
"text"
></el-input>
</el-form-item>
<el-form-item
label=
"收货地址"
required
>
<el-input
v-model=
"form.receive_address"
type=
"text"
></el-input>
</el-form-item>
<el-form-item
label=
"物流状态"
>
<el-radio-group
v-model=
"form.status"
>
<el-radio
:label=
"0"
>
待发货
</el-radio>
<el-radio
:label=
"1"
>
已发货
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"物流单号"
>
<el-input
v-model=
"form.express_no"
type=
"text"
></el-input>
</el-form-item>
<el-form-item
label=
"物流名称"
>
<el-input
v-model=
"form.express_name"
type=
"text"
></el-input>
</el-form-item>
</el-form>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.show = false"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"saveAddress"
>
保 存
</el-button>
</div>
</el-dialog>
</
template
>
<
script
>
import
{
putDisposableApi
}
from
"../../service/api"
;
export
default
{
name
:
"dialogObj"
,
props
:
[
'dialogObj'
],
data
()
{
return
{
form
:
{
}
}
},
watch
:
{
'dialogObj.show'
:
{
deep
:
true
,
handler
:
function
()
{
console
.
log
(
this
.
dialogObj
)
this
.
form
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
dialogObj
))
}
}
},
methods
:
{
saveAddress
()
{
if
(
!
this
.
form
.
receive_name
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请输入收货人名'
});
return
}
if
(
!
this
.
form
.
receive_mobile
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请输入收货手机号'
});
return
}
if
(
!
this
.
form
.
receive_address
)
{
this
.
$message
({
type
:
'error'
,
message
:
'请输入收货地址'
});
return
}
this
.
$confirm
(
'确定保存?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
let
json
=
{
deliver_id
:
this
.
form
.
id
,
receive_address
:
this
.
form
.
receive_address
,
receive_name
:
this
.
form
.
receive_name
,
receive_mobile
:
this
.
form
.
receive_mobile
,
express_no
:
this
.
form
.
express_no
,
express_name
:
this
.
form
.
express_name
,
status
:
this
.
form
.
status
};
//this.form.express_no ? json.express_no = this.form.express_no : '';
//this.form.express_name ? json.express_name = this.form.express_name : '';
putDisposableApi
(
this
.
form
.
id
,
json
).
then
(
res
=>
{
this
.
$message
({
type
:
'success'
,
message
:
'修改成功'
});
this
.
dialogObj
.
show
=
false
;
this
.
$emit
(
"reflash"
);
});
})
},
},
mounted
()
{
console
.
log
(
this
.
dialogObj
)
}
}
</
script
>
src/components/disposable/index.vue
0 → 100644
View file @
ddf5cef0
<
template
>
<div
class=
"admin-refresh"
>
<div
class=
"section-search"
>
<el-form
ref=
"searchFrom"
:model=
"searchFrom"
inline
size=
"small"
>
<el-form-item>
<el-input
v-model=
"searchFrom.user_id"
style=
"width: 120px"
placeholder=
"用户ID"
clearable
></el-input>
</el-form-item>
<!--
<el-form-item
label=
"发货状态"
>
<el-select
filterable
v-model=
"searchFrom.type"
placeholder=
"请选择"
clearable
>
<el-option
v-for=
"(data,index) in logisticsType"
:key=
"index"
:label=
"data.name"
:value=
"data.value"
>
</el-option>
</el-select>
</el-form-item>
-->
<el-form-item>
<div
class=
"search-btn-wrapper"
>
<el-button
type=
"primary"
plain
@
click=
"getList"
>
搜索
</el-button>
<!--
<el-button
v-if=
"!$store.state.readonly"
type=
"primary"
plain
@
click=
"downLoad()"
>
excel模板下载
</el-button>
-->
<el-button
type=
"success"
plain
@
click=
"exportTable"
v-if=
"$store.state.export"
>
导出
</el-button>
<el-upload
style=
"margin-left: 10px;"
v-if=
"$store.state.import"
:show-file-list=
"false"
:onSuccess=
"fileSuccess"
:headers=
"uploadHeader"
:data=
"
{param_token:param_token}"
action="/api/admin/order/deliver/list/import">
<el-button
type=
"success"
plain
>
导入发货信息
</el-button>
</el-upload>
</div>
</el-form-item>
</el-form>
</div>
<el-tabs
v-model=
"searchFrom.type"
type=
"card"
@
tab-click=
"handleClick"
style=
"padding-top: 10px;background-color: #fff"
>
<el-tab-pane
label=
"所有"
name=
"2"
></el-tab-pane>
<el-tab-pane
label=
"待发货"
name=
"0"
></el-tab-pane>
<el-tab-pane
label=
"已发货"
name=
"1"
></el-tab-pane>
</el-tabs>
<el-table
:data=
"deliverList"
size=
"mini"
style=
"width: 100%"
>
<el-table-column
width=
"200"
class=
"f-c"
label=
"用户"
>
<template
slot-scope=
"scope"
>
<img
style=
"vertical-align: top"
class=
"avatar"
:src=
"scope.row.user_avatar"
/>
<span
style=
"display: inline-block;"
>
{{
scope
.
row
.
user_nickname
}}
<br/>
(ID:
{{
scope
.
row
.
user_id
}}
)
<br/>
手机:
{{
scope
.
row
.
user_mobile
}}
</span>
</
template
>
</el-table-column>
<el-table-column
prop=
"address"
label=
"收货地址"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
receive_name
}}
<br/>
{{
scope
.
row
.
receive_mobile
}}
<br/>
{{
scope
.
row
.
receive_address
}}
</
template
>
</el-table-column>
<el-table-column
prop=
"goods_title"
label=
"商品名"
></el-table-column>
<el-table-column
label=
"货品类型"
width=
"80px"
>
<
template
slot-scope=
"scope"
>
{{
scope
.
row
.
goods_type
==
0
?
'订单货品'
:
(
scope
.
row
.
goods_type
==
1
?
'赠品'
:
''
)
}}
</
template
>
</el-table-column>
<el-table-column
prop=
"updated_at"
label=
"最后更新"
width=
"95px"
></el-table-column>
<el-table-column
prop=
"deliver_at"
label=
"发货时间"
width=
"100px"
></el-table-column>
<el-table-column
prop=
"status"
label=
"物流状态"
>
<
template
slot-scope=
"scope"
>
<template
v-if=
"scope.row.status == 0"
>
<div
style=
"color: #e6a23c;"
>
{{
scope
.
row
.
status
|
LogisticsStatusFil
}}
</div>
</
template
>
<
template
v-else-if=
"scope.row.status == 1"
>
<div
style=
"color: #67c23a;"
>
{{
scope
.
row
.
status
|
LogisticsStatusFil
}}
</div>
</
template
>
<!--<template v-if="scope.row.status == 1">-->
<
template
v-if=
"scope.row.express_name"
>
{{
scope
.
row
.
express_name
}}
:
</
template
>
<a
v-if=
"scope.row.express_no"
:href=
"`https://m.baidu.com/from=1013755s/s?word=${scope.row.express_no}&sa=tb&ts=2790568&t_kt=0&ie=utf-8&rsv_t=cbe2F%252FT5T3MIzkRl%252Fg8ZUw%252FEPHZmn2wHIrB8cLvgNlEKyyDqUNPrTyDEEDjkAb8&rsv_pq=11793168499026332712&ss=110000000001&tj=1&rqlang=zh&rsv_sug4=4111&inputT=3178&oq=快递单号查询`"
target=
"_blank"
>
{{scope.row.express_no}}
</a>
<!--</template>-->
</template>
</el-table-column>
<el-table-column
width=
"80"
label=
"操作"
v-if=
"!$store.state.readonly"
fixed=
"right"
>
<
template
slot-scope=
"scope"
>
<el-button
@
click=
"editAddress(scope.row)"
plain
type=
"primary"
size=
"mini"
>
编辑
</el-button>
</
template
>
</el-table-column>
</el-table>
<page
:nowPage=
"nowPage"
:total=
"total"
@
pageChange=
"onPageChange"
@
sizeChange=
"onSizeChange"
/>
<address-dialog
:dialogObj=
"dialogObj"
@
reflash=
"onUpdateAddress"
></address-dialog>
</div>
</template>
<
script
>
import
page
from
"../framework/page"
;
import
md5
from
"js-md5"
;
import
addressDialog
from
"./dialog"
;
import
receiveInfoDialog
from
"./receiveInfoDialog"
;
import
Cookie
from
'../../util/cookie'
import
CommonJs
from
'../../util/common'
;
import
{
getDisposableApi
,
exportExcelApi
}
from
"../../service/api"
;
import
{
LogisticsStatus
,
GOODSTYPE
}
from
"../../util/wordbook"
;
export
default
{
name
:
"index"
,
components
:
{
page
,
addressDialog
,
receiveInfoDialog
},
data
()
{
let
singjson
=
{
sing
:
"singsingenglish21000"
};
return
{
dialogObj
:
{
show
:
false
},
showFlag
:
false
,
adressDialog
:
false
,
searchFrom
:
{
user_id
:
""
,
theme_id
:
""
,
periods_id
:
""
,
type
:
"2"
},
nowPage
:
1
,
total
:
0
,
limit
:
10
,
deliverList
:
[],
selectedGoods
:
[],
secGoods
:
[],
periodsId
:
null
,
goods_id
:
null
,
goodsList
:
[],
themeList
:
[],
uploadHeader
:
{
token
:
Cookie
.
get
(
'cc_token'
)},
param_token
:
CommonJs
.
md5Code
(),
logisticsType
:
[
{
value
:
"0"
,
name
:
"当前待发货 "
},
{
value
:
"1"
,
name
:
"所有待发货 "
},
{
value
:
"2"
,
name
:
"所有已发货 "
}
]
};
},
filters
:
{
LogisticsStatusFil
(
val
)
{
return
LogisticsStatus
[
val
];
}
},
mounted
()
{
this
.
init
();
},
methods
:
{
cancelEvent
()
{
this
.
showFlag
=
false
;
},
sureEvent
()
{
this
.
showFlag
=
false
;
},
handleClick
(
tab
)
{
//this.searchFrom.type = tab.name;
this
.
getList
();
},
editAddress
(
row
)
{
console
.
log
(
row
);
//if (row.status == 1) {
this
.
dialogObj
.
express_no
=
row
.
express_no
;
this
.
dialogObj
.
express_name
=
row
.
express_name
;
this
.
dialogObj
.
status
=
row
.
status
;
//}
this
.
dialogObj
.
receive_address
=
row
.
receive_address
;
this
.
dialogObj
.
receive_mobile
=
row
.
receive_mobile
;
this
.
dialogObj
.
receive_name
=
row
.
receive_name
;
this
.
dialogObj
.
id
=
row
.
id
;
this
.
dialogObj
.
show
=
true
;
},
onUpdateAddress
()
{
this
.
dialogObj
.
show
=
false
;
this
.
getList
();
},
fileSuccess
()
{
this
.
$message
({
message
:
"提交成功,请稍后刷新"
,
type
:
"success"
});
this
.
getList
();
},
init
()
{
this
.
getList
();
},
exportTable
()
{
let
json
=
{};
if
(
this
.
searchFrom
.
user_id
)
{
json
.
user_id
=
this
.
searchFrom
.
user_id
;
}
if
(
this
.
searchFrom
.
type
&&
(
this
.
searchFrom
.
type
!=
'2'
))
{
json
.
status
=
this
.
searchFrom
.
type
;
}
exportExcelApi
(
"/api/admin/user/deliver/once/export"
,
json
);
},
initQuery
()
{
let
_query
=
this
.
$route
.
query
;
if
(
_query
&&
_query
.
goods_id
&&
_query
.
periods_id
)
{
this
.
goods_id
=
_query
.
goods_id
;
this
.
selectedGoods
=
[
parseInt
(
_query
.
goods_id
),
parseInt
(
_query
.
periods_id
)
];
getPeriodsApi
({
goods_id
:
this
.
selectedGoods
[
0
],
limit
:
100
}).
then
(
res
=>
{
res
.
list
.
forEach
(
i
=>
{
i
.
name
=
i
.
title
;
});
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
0
];
}).
children
=
res
.
list
;
let
nowGoods
=
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
0
];
});
this
.
periods
=
nowGoods
.
children
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
1
];
});
console
.
log
(
this
.
periods
);
}
);
}
else
{
getDefaultPeriodsApi
().
then
(
res
=>
{
console
.
log
(
res
);
//
if
(
res
)
{
this
.
goods_id
=
res
.
goods_id
;
this
.
selectedGoods
=
[
parseInt
(
res
.
goods_id
),
parseInt
(
res
.
id
)];
getPeriodsApi
({
goods_id
:
this
.
selectedGoods
[
0
],
limit
:
100
}).
then
(
res
=>
{
res
.
list
.
forEach
(
i
=>
{
i
.
name
=
i
.
title
;
});
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
0
];
}).
children
=
res
.
list
;
let
nowGoods
=
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
0
];
});
this
.
periods
=
nowGoods
.
children
.
find
(
i
=>
{
return
i
.
id
===
this
.
selectedGoods
[
1
];
});
this
.
teacher_id
=
""
;
console
.
log
(
this
.
periods
);
// this.getClassList()
}
);
}
});
}
console
.
log
(
this
.
goodsList
);
},
onPageChange
(
val
)
{
// console.log(val)
this
.
nowPage
=
val
;
this
.
getList
();
},
onSizeChange
(
val
)
{
this
.
limit
=
val
;
this
.
nowPage
=
1
;
this
.
getList
();
},
getList
()
{
let
json
=
{
limit
:
this
.
limit
,
page
:
this
.
nowPage
};
if
(
this
.
searchFrom
.
user_id
)
{
json
.
user_id
=
this
.
searchFrom
.
user_id
;
}
if
(
this
.
searchFrom
.
type
&&
(
this
.
searchFrom
.
type
!=
'2'
))
{
json
.
status
=
this
.
searchFrom
.
type
;
}
getDisposableApi
(
json
).
then
(
res
=>
{
this
.
deliverList
=
res
.
list
;
this
.
total
=
res
.
total
;
});
},
reset
()
{
this
.
searchFrom
=
{
user_id
:
""
,
theme_id
:
""
,
periods_id
:
""
,
type
:
""
};
this
.
getList
();
},
}
};
</
script
>
<
style
scoped
>
.sms
{
padding
:
20px
0
;
}
.avatar
{
width
:
50px
;
min-width
:
50px
;
margin-right
:
10px
;
height
:
50px
;
border-radius
:
50%
;
}
</
style
>
<
style
>
.userInfo
>
div
{
display
:
flex
;
flex-flow
:
row
nowrap
;
justify-content
:
flex-start
;
align-items
:
center
;
}
.f-c
>
.cell
{
display
:
flex
!important
;
flex-flow
:
row
;
justify-content
:
flex-start
;
align-items
:
center
;
}
</
style
>
src/components/disposable/receiveInfoDialog.vue
0 → 100644
View file @
ddf5cef0
<
template
>
<el-dialog
:visible
.
sync=
"showFlag"
width=
"800px"
center
title=
"按期数导出收货信息"
>
<el-form
label-width=
"150px"
>
<el-form-item
label=
"期数"
>
<el-cascader
:options=
"goodsList"
:props=
"
{value:'id',label:'name'}"
@active-item-change="handleItemChange"
@change="changePeriods"
v-model="selectedGoods"
>
</el-cascader>
</el-form-item>
</el-form>
<span
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"cancelClick"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"onAdd"
>
确 定
</el-button>
</span>
</el-dialog>
</
template
>
<
script
>
import
{
getPeriodsApi
,
exportReceiveInfoApi
}
from
"../../service/api"
;
export
default
{
name
:
"receiveInfoDialog"
,
props
:
[
"showFlag"
,
"goodsList"
,
"cancelEvent"
,
"sureEvent"
],
data
()
{
return
{
selectedGoods
:
[]
};
},
methods
:
{
cancelClick
()
{
this
.
cancelEvent
();
},
onAdd
()
{
if
(
this
.
periods
&&
this
.
periods
.
id
)
{
this
.
exportReceiveInfo
().
then
(()
=>
{
this
.
sureEvent
();
});
}
else
{
Vue
.
prototype
.
$msgbox
({
message
:
"请选择期数"
,
type
:
"warning"
});
}
},
exportReceiveInfo
()
{
return
exportReceiveInfoApi
(
this
.
periods
.
id
);
},
changePeriods
(
data
)
{
if
(
data
.
length
>
1
)
{
this
.
goods_id
=
data
[
0
];
let
nowGoods
=
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
data
[
0
];
});
this
.
periods
=
nowGoods
.
children
.
find
(
i
=>
{
return
i
.
id
===
data
[
1
];
});
}
},
handleItemChange
(
val
)
{
getPeriodsApi
({
goods_id
:
val
[
0
],
limit
:
100
}).
then
(
res
=>
{
res
.
list
.
forEach
(
i
=>
{
i
.
name
=
i
.
title
;
});
this
.
goodsList
.
find
(
i
=>
{
return
i
.
id
===
val
[
0
];
}).
children
=
res
.
list
;
});
}
}
};
</
script
>
src/components/framework/leftMenu.vue
View file @
ddf5cef0
...
...
@@ -38,7 +38,7 @@ export default {
};
},
mounted
()
{
console
.
log
(
this
.
menuList
);
//
console.log(this.menuList);
},
methods
:
{
changeMenuType
:
function
()
{
...
...
src/components/framework/teacherDesc.vue
View file @
ddf5cef0
...
...
@@ -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
})
},
...
...
src/components/logistics/index.vue
View file @
ddf5cef0
<
template
>
<div
class=
"admin-refresh
sms
"
>
<div
class=
"admin-refresh"
>
<div
class=
"section-search"
>
<el-form
ref=
"searchFrom"
:model=
"searchFrom"
label-width=
"100px"
inline
size=
"small"
>
<el-form-item
label=
"用户ID"
>
<el-input
v-model=
"searchFrom.user_id"
style=
"width:
80px
"
></el-input>
<el-form-item>
<el-input
v-model=
"searchFrom.user_id"
style=
"width:
100px"
placeholder=
"用户ID
"
></el-input>
</el-form-item>
<!--
<el-form-item
label=
"发货状态"
>
<el-select
filterable
v-model=
"searchFrom.type"
placeholder=
"请选择"
clearable
>
...
...
@@ -15,8 +15,9 @@
</el-option>
</el-select>
</el-form-item>
-->
<el-form-item
label=
"期数"
>
<el-form-item>
<el-cascader
placeholder=
"请选择期数"
:popper-class=
"'refresh-cascader-multi width-480'"
style=
"width: 480px"
:options=
"goodsList"
...
...
@@ -26,35 +27,36 @@
filterable
v-model="selectedGoods">
</el-cascader>
</el-form-item>
<el-form-item
label=
"主题"
>
<el-select
filterable
v-model=
"searchFrom.theme_id"
placeholder=
"请选择"
clearable
>
<el-form-item>
<el-select
filterable
v-model=
"searchFrom.theme_id"
placeholder=
"请选择
主题
"
clearable
>
<el-option
v-for=
"(data,index) in themeList"
:key=
"index"
:label=
"data.name"
:value=
"data.id"
></el-option>
:value=
"data.id"
></el-option>
</el-select>
</el-form-item>
<!--
<el-form-item
label=
"期数id"
>
<el-input
v-model=
"searchFrom.periods_id"
style=
"width: 120px"
></el-input>
</el-form-item>
-->
<el-form-item>
<el-button
type=
"primary"
plain
@
click=
"getList"
>
搜索
</el-button>
<el-button
type=
"success"
plain
@
click=
"reset"
>
重置
</el-button>
<el-button
v-if=
"!$store.state.readonly"
type=
"primary"
plain
@
click=
"downLoad()"
>
excel模板下载
</el-button>
<el-button
type=
"primary"
plain
@
click=
"exportTable"
v-if=
"$store.state.export"
>
导出当前待发货
</el-button>
<el-button
type=
"primary"
plain
@
click=
"exportReceiveInfoTable"
>
按期数导出收货信息
</el-button>
</el-form-item>
<el-form-item
v-if=
"$store.state.import"
>
<el-upload
:show-file-list=
"false"
:onSuccess=
"fileSuccess"
:headers=
"uploadHeader"
:data=
"
{param_token:param_token}"
action="/api/admin/order/deliver/list/import">
<el-button
type=
"success"
plain
>
导入发货信息
</el-button>
</el-upload>
<div
class=
"search-btn-wrapper"
>
<el-button
type=
"primary"
plain
@
click=
"getList"
>
搜索
</el-button>
<el-button
type=
"success"
plain
@
click=
"reset"
>
重置
</el-button>
<el-button
v-if=
"!$store.state.readonly"
type=
"primary"
plain
@
click=
"downLoad()"
>
excel模板下载
</el-button>
<el-button
type=
"primary"
plain
@
click=
"exportTable"
v-if=
"$store.state.export"
>
导出当前待发货
</el-button>
<el-button
type=
"primary"
plain
@
click=
"exportReceiveInfoTable"
>
按期数导出收货信息
</el-button>
<el-upload
style=
"margin-left: 10px;"
v-if=
"$store.state.import"
:show-file-list=
"false"
:onSuccess=
"fileSuccess"
:headers=
"uploadHeader"
:data=
"
{param_token:param_token}"
action="/api/admin/order/deliver/list/import">
<el-button
type=
"success"
plain
>
导入发货信息
</el-button>
</el-upload>
</div>
</el-form-item>
</el-form>
</div>
...
...
@@ -436,16 +438,11 @@ export default {
.sms
{
padding
:
20px
0
;
}
.el-button
+
.el-button
{
margin-left
:
0
;
/* margin-top: 10px; */
}
.avatar
{
width
:
50px
;
min-width
:
50px
;
margin-right
:
10px
;
height
:
50px
;
border-radius
:
50%
;
}
</
style
>
...
...
src/components/logistics/receiveInfoDialog.vue
View file @
ddf5cef0
...
...
@@ -23,7 +23,9 @@ export default {
name
:
"receiveInfoDialog"
,
props
:
[
"showFlag"
,
"goodsList"
,
"cancelEvent"
,
"sureEvent"
],
data
()
{
return
{};
return
{
selectedGoods
:
[]
};
},
methods
:
{
cancelClick
()
{
...
...
@@ -67,4 +69,4 @@ export default {
}
}
};
</
script
>
\ No newline at end of file
</
script
>
src/components/system/role.vue
View file @
ddf5cef0
...
...
@@ -88,7 +88,7 @@
limit
:
10
,
roleList
:
[],
exportMenuList
:
[
// 导出权限
'2-3'
,
'5-10'
,
'5-2'
,
'5-1'
,
'5-3'
,
'5-8'
,
'5-9'
,
'3-1'
,
'7-9'
,
'6-3'
,
'10-8'
'2-3'
,
'5-10'
,
'5-2'
,
'5-1'
,
'5-3'
,
'5-8'
,
'5-9'
,
'
6-4'
,
'
3-1'
,
'7-9'
,
'6-3'
,
'10-8'
],
dialog
:
{
title
:
'新增角色'
,
...
...
src/components/teacherDetail/task.vue
View file @
ddf5cef0
...
...
@@ -132,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
...
...
@@ -253,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
...
...
@@ -365,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
>
...
...
@@ -396,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
...
...
src/components/teacherDetail/task1.vue
View file @
ddf5cef0
...
...
@@ -384,7 +384,7 @@
</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>
...
...
src/components/teacherDetail/task2.vue
View file @
ddf5cef0
...
...
@@ -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
...
...
src/components/teacherDetail/task3.vue
View file @
ddf5cef0
...
...
@@ -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
...
...
src/components/user/index.vue
View file @
ddf5cef0
<
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
:
{
...
...
src/components/userDetail/addressdialog.vue
View file @
ddf5cef0
...
...
@@ -104,7 +104,7 @@ import AddressArray from '../framework/address-picker/addr'
vueAddress
},
mounted
(){
console
.
log
(
this
.
dialogObj
)
//
console.log(this.dialogObj)
}
}
</
script
>
...
...
src/components/userDetail/index.vue
View file @
ddf5cef0
<
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;"
>
(暂无子账户)
</p>
<p
class=
"fl"
v-if=
"subDetail.nickname"
style=
"clear:both;"
>
(子账户)
</p>
</div>
</
div
>
<p
class=
"fl"
v-if=
"!subDetail.nickname"
style=
"clear:both;"
>
(暂无子账户)
</p
>
<p
class=
"fl"
v-if=
"subDetail.nickname"
style=
"clear:both;"
>
(子账户)
</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'
],
moun
ted
()
{
crea
ted
()
{
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
:
10
px
;
width
:
600
px
;
padding
:
20
px
;
/*margin: 10px;*/
/*width: 600px;*/
/*padding: 20px;*/
// display: flex;
.
text
.
item
{
line
-
height
:
30
px
;
...
...
src/router/index.js
View file @
ddf5cef0
...
...
@@ -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
=>
{
...
...
src/service/api.js
View file @
ddf5cef0
...
...
@@ -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
)
{
...
...
@@ -1094,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
)
...
...
@@ -1240,6 +1261,14 @@ export const delStarActivityV2PeriodApi = function (periods_id) {
export
const
getDeliverListApi
=
function
(
json
)
{
return
Vue
.
prototype
.
$fetch
(
`api/admin/order/deliver/list`
,
json
)
};
// 获取一次性物流信息
export
const
getDisposableApi
=
function
(
json
)
{
return
Vue
.
prototype
.
$fetch
(
`
${
_baseUrl
}
api/admin/deliver/once/list`
,
json
)
};
// 编辑一次性物流信息
export
const
putDisposableApi
=
function
(
id
,
json
)
{
return
Vue
.
prototype
.
$put
(
`
${
_baseUrl
}
api/admin/deliver/once/
${
id
}
`
,
json
)
};
//主题列表
export
const
getThemeListApi
=
function
(
json
)
{
return
Vue
.
prototype
.
$fetch
(
`api/admin/course/theme/list`
,
json
)
...
...
src/service/index.js
View file @
ddf5cef0
...
...
@@ -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
({
...
...
src/util/menuList.js
View file @
ddf5cef0
...
...
@@ -427,8 +427,7 @@ export default [{
},
]
},
{
},
{
name
:
''
,
value
:
'实物管理'
,
icon
:
'icon-shu'
,
...
...
@@ -442,8 +441,7 @@ export default [{
name
:
'single'
,
component
:
e
=>
require
([
'@/components/single'
],
e
),
}
},
{
},
{
value
:
'盒子列表'
,
routerName
:
'box'
,
path
:
'/box'
,
...
...
@@ -453,8 +451,7 @@ export default [{
name
:
'box'
,
component
:
e
=>
require
([
'@/components/box'
],
e
),
}
},
{
},{
value
:
'待发货列表'
,
routerName
:
'logistics'
,
path
:
'/logistics'
,
...
...
@@ -464,8 +461,17 @@ export default [{
name
:
'logistics'
,
component
:
e
=>
require
([
'@/components/logistics'
],
e
),
}
},
]
},{
value
:
'一次性物流信息'
,
routerName
:
'disposable'
,
path
:
'/disposable'
,
cover
:
'6-4'
,
router
:
{
path
:
'/disposable'
,
name
:
'disposable'
,
component
:
e
=>
require
([
'@/components/disposable'
],
e
),
}
}]
},
{
name
:
''
,
value
:
'公众号'
,
...
...
src/util/wordbook.js
View file @
ddf5cef0
export
const
ADMINSTATUS
=
{
'0'
:
'启用'
,
'1'
:
'冻结'
'0'
:
'启用'
,
'1'
:
'冻结'
};
export
const
TEACHERTYPE
=
{
'0'
:
'老师'
,
'1'
:
'新星妈妈'
,
'2'
:
'推广人'
,
'3'
:
'市场'
'0'
:
'老师'
,
'1'
:
'新星妈妈'
,
'2'
:
'推广人'
,
'3'
:
'市场'
};
export
const
LESSONTYPE
=
{
'0'
:
'月课'
,
'1'
:
'日课'
export
const
LESSONTYPE
=
{
'0'
:
'月课'
,
'1'
:
'日课'
};
export
const
GOODSTYPE
=
{
'1'
:
'普通商品'
,
'2'
:
'团购商品'
,
'3'
:
'续课商品'
,
'4'
:
'优惠券商品'
,
'5'
:
'实物商品'
,
'1'
:
'普通商品'
,
'2'
:
'团购商品'
,
'3'
:
'续课商品'
,
'4'
:
'优惠券商品'
,
'5'
:
'实物商品'
,
};
export
const
ISORNOT
=
{
'0'
:
'否'
,
'1'
:
'是'
'0'
:
'否'
,
'1'
:
'是'
};
export
const
GOODSSTATUS
=
{
'0'
:
'编辑中'
,
'1'
:
'在售'
,
'2'
:
'下架'
'0'
:
'编辑中'
,
'1'
:
'在售'
,
'2'
:
'下架'
};
export
const
WEEKDAY
=
{
0
:
'周日'
,
...
...
@@ -38,21 +38,21 @@ export const WEEKDAY = {
6
:
'周六'
};
export
const
INVITETYPE
=
{
0
:
'用户'
,
1
:
'老师'
,
2
:
'推广渠道'
0
:
'用户'
,
1
:
'老师'
,
2
:
'推广渠道'
};
export
const
ORDERSTATUS
=
{
0
:
'待付款'
,
1
:
'付款成功'
,
2
:
'付款失败'
,
3
:
'退款成功'
,
4
:
'拼团成功'
,
5
:
'部分退款'
0
:
'待付款'
,
1
:
'付款成功'
,
2
:
'付款失败'
,
3
:
'退款成功'
,
4
:
'拼团成功'
,
5
:
'部分退款'
};
export
const
BUYTYPE
=
{
1
:
'单买'
,
2
:
'团购'
1
:
'单买'
,
2
:
'团购'
};
export
const
BUYTYPEOPTION
=
[
{
...
...
@@ -88,12 +88,12 @@ export const BUYWay = [
},
]
export
const
BUYTYPEWAY
=
{
'1'
:
'微信'
,
'2'
:
'支付宝'
,
'4'
:
'京东'
,
'3'
:
'云集'
,
'100'
:
'其他'
,
'0'
:
'其他'
,
'1'
:
'微信'
,
'2'
:
'支付宝'
,
'4'
:
'京东'
,
'3'
:
'云集'
,
'100'
:
'其他'
,
'0'
:
'其他'
,
};
export
const
ORDERSTATUSOPTION
=
[
{
...
...
@@ -136,20 +136,20 @@ export const INVITETYPEOPTION = [
}
];
export
const
QRTYPE
=
{
1
:
'永久'
,
2
:
'临时'
1
:
'永久'
,
2
:
'临时'
};
export
const
QRCODETYPE
=
{
1
:
'渠道'
,
2
:
'用户'
1
:
'渠道'
,
2
:
'用户'
};
export
const
QRSTATUS
=
{
0
:
'正常'
,
1
:
'禁用'
0
:
'正常'
,
1
:
'禁用'
};
export
const
ISLEADER
=
{
0
:
'否'
,
1
:
'是'
0
:
'否'
,
1
:
'是'
};
export
const
ISLEADEROPTION
=
[
{
...
...
@@ -161,63 +161,110 @@ export const ISLEADEROPTION = [
value
:
'是'
},
];
export
const
INTEGRALTYPE
=
{
0
:
'减少积分'
,
1
:
'添加积分'
export
const
INTEGRALTYPE
=
{
0
:
'减少积分'
,
1
:
'添加积分'
};
export
const
INTEGRALFUN
=
{
0
:
'看课加积分'
,
1
:
'分享加积分'
,
2
:
'邀约报课加积分'
,
3
:
'后台手动加积分'
,
4
:
'后台手动减积分'
,
export
const
INTEGRALFUN
=
{
0
:
'看课加积分'
,
1
:
'分享加积分'
,
2
:
'邀约报课加积分'
,
3
:
'后台手动加积分'
,
4
:
'后台手动减积分'
,
};
export
const
CLASSSOURCE
=
{
1
:
'所有来源随机'
,
2
:
'系统订单随机'
,
3
:
'渠道1订单随机'
,
4
:
'渠道2订单随机'
,
5
:
'渠道3订单随机'
,
6
:
'渠道4订单随机'
,
7
:
'渠道5订单随机'
,
8
:
'渠道6订单随机'
,
1
:
'所有来源随机'
,
2
:
'系统订单随机'
,
3
:
'渠道1订单随机'
,
4
:
'渠道2订单随机'
,
5
:
'渠道3订单随机'
,
6
:
'渠道4订单随机'
,
7
:
'渠道5订单随机'
,
8
:
'渠道6订单随机'
,
};
export
const
USERSTATUS
=
[
{
code
:
0
,
lable
:
'待处理'
},
{
code
:
1
,
lable
:
'手机号不是微信号'
},
{
code
:
2
,
lable
:
'待通过'
},
{
code
:
3
,
lable
:
'已加微信未激活'
},
{
code
:
4
,
lable
:
'第一次电话无人接/挂断/关机'
},
{
code
:
5
,
lable
:
'第二次电话无人接/挂断/关机'
},
{
code
:
6
,
lable
:
'第三次电话无人接/挂断/关机'
},
{
code
:
7
,
lable
:
'用户已拒绝'
},
{
code
:
8
,
lable
:
'手机号是空号'
},
{
code
:
9
,
lable
:
'已激活'
}
{
code
:
0
,
lable
:
'待处理'
},
{
code
:
1
,
lable
:
'手机号不是微信号'
},
{
code
:
2
,
lable
:
'待通过'
},
{
code
:
3
,
lable
:
'已加微信未激活'
},
{
code
:
4
,
lable
:
'第一次电话无人接/挂断/关机'
},
{
code
:
5
,
lable
:
'第二次电话无人接/挂断/关机'
},
{
code
:
6
,
lable
:
'第三次电话无人接/挂断/关机'
},
{
code
:
7
,
lable
:
'用户已拒绝'
},
{
code
:
8
,
lable
:
'手机号是空号'
},
{
code
:
9
,
lable
:
'已激活'
}
]
export
const
USERSTATUSFORMATER
=
{
0
:
'待处理'
,
1
:
'手机号不是微信号'
,
2
:
'待通过'
,
3
:
'已加微信未激活'
,
4
:
'第一次电话无人接/挂断/关机'
,
5
:
'第二次电话无人接/挂断/关机'
,
6
:
'第三次电话无人接/挂断/关机'
,
7
:
'用户已拒绝'
,
8
:
'手机号是空号'
,
9
:
'已激活'
,
0
:
'待处理'
,
1
:
'手机号不是微信号'
,
2
:
'待通过'
,
3
:
'已加微信未激活'
,
4
:
'第一次电话无人接/挂断/关机'
,
5
:
'第二次电话无人接/挂断/关机'
,
6
:
'第三次电话无人接/挂断/关机'
,
7
:
'用户已拒绝'
,
8
:
'手机号是空号'
,
9
:
'已激活'
,
};
export
const
externalLaunchStatusParams
=
{
0
:
'待处理'
,
1
:
'已激活'
,
2
:
'假号'
,
3
:
'没兴趣'
0
:
'待处理'
,
1
:
'已激活'
,
2
:
'假号'
,
3
:
'没兴趣'
};
export
const
LogisticsStatus
=
{
0
:
'待发货'
,
1
:
'已发货'
,
2
:
'已签收'
,
3
:
'异常'
0
:
'待发货'
,
1
:
'已发货'
,
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
}];
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment