Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
P
pica-admin-consultation
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
Close sidebar
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
com.pica.cloud.education.frontend
pica-admin-consultation
提交
da310661
提交
da310661
编写于
1月 11, 2021
作者:
guangjun.yang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
客服IM工具
上级
c133db47
变更
20
展开全部
隐藏空白字符变更
内嵌
并排
正在显示
20 个修改的文件
包含
2811 行增加
和
683 行删除
+2811
-683
.DS_Store
.DS_Store
+0
-0
.DS_Store
src/.DS_Store
+0
-0
main.js
src/main.js
+0
-7
logger.js
src/plugins/logger.js
+0
-56
swiper.min.js
src/plugins/swiper.min.js
+0
-19
router.js
src/router/router.js
+29
-14
global.scss
src/style/global.scss
+4
-0
env-config.js
src/utils/env-config.js
+2
-2
fetch.js
src/utils/fetch.js
+0
-3
index.js
src/utils/index.js
+1
-1
detail.vue
src/views/IM/search-message/detail.vue
+583
-0
list.vue
src/views/IM/search-message/list.vue
+227
-0
edit.vue
src/views/IM/waiting-session/edit.vue
+583
-0
list copy.vue
src/views/IM/waiting-session/list copy.vue
+321
-0
list-with-pagenat.vue
src/views/IM/waiting-session/list-with-pagenat.vue
+215
-0
list.vue
src/views/IM/waiting-session/list.vue
+188
-0
index.vue
src/views/discuss/index.vue
+320
-301
footer.vue
src/views/layout/footer.vue
+22
-22
header.vue
src/views/layout/header.vue
+172
-154
slidebar.vue
src/views/layout/slidebar.vue
+144
-104
未找到文件。
.DS_Store
浏览文件 @
da310661
无法预览此类型文件
src/.DS_Store
浏览文件 @
da310661
无法预览此类型文件
src/main.js
浏览文件 @
da310661
...
@@ -4,7 +4,6 @@ import VueRouter from 'vue-router'
...
@@ -4,7 +4,6 @@ import VueRouter from 'vue-router'
import
routes
from
'./router/router'
import
routes
from
'./router/router'
import
store
from
'./store/'
import
store
from
'./store/'
const
mixins
=
require
(
'@/utils/mixins'
);
const
mixins
=
require
(
'@/utils/mixins'
);
import
FastClick
from
'fastclick'
import
vueFilters
from
'@/utils/filter'
import
vueFilters
from
'@/utils/filter'
// 引入ElementUI
// 引入ElementUI
...
@@ -13,7 +12,6 @@ import 'element-ui/lib/theme-chalk/index.css';
...
@@ -13,7 +12,6 @@ import 'element-ui/lib/theme-chalk/index.css';
// 可调试
// 可调试
// Vue.config.devtools = true;
// Vue.config.devtools = true;
// Vue.use(Logger, { prefix: new Date(), isDev: process.env.NODE_ENV === 'development', cLevel: 'debug' })
Vue
.
use
(
ElementUI
)
Vue
.
use
(
ElementUI
)
...
@@ -22,11 +20,6 @@ for(let key in vueFilters) {
...
@@ -22,11 +20,6 @@ for(let key in vueFilters) {
Vue
.
filter
(
key
,
vueFilters
[
key
])
Vue
.
filter
(
key
,
vueFilters
[
key
])
}
}
if
(
'addEventListener'
in
document
)
{
document
.
addEventListener
(
'DOMContentLoaded'
,
function
()
{
FastClick
.
attach
(
document
.
body
);
},
false
);
}
Vue
.
use
(
VueRouter
)
Vue
.
use
(
VueRouter
)
const
router
=
new
VueRouter
({
const
router
=
new
VueRouter
({
...
...
src/plugins/logger.js
已删除
100644 → 0
浏览文件 @
c133db47
/**
* G-Logger
* version 1.0.0
* Author: Anndy Yang(Guang Jun)
* description: 模拟log4j的日志插件(Vue插件,同时支持浏览器环境)
*
* log4j提供了4种日志级别和2个日志开关。
官方网址: http://logging.apache.org/log4j/1.2/
DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN: 输出警告信息;表明会出现潜在错误的情形。
ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录。
按照范围从小到大排序:OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的。
例如日志设置为INFO级别,则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
*/
const
gLogger
=
{}
gLogger
.
install
=
function
(
Vue
,
options
)
{
if
(
gLogger
.
installed
)
return
let
logger
=
{
isDev
:
true
,
cLevel
:
'debug'
,
prefix
:
'gLogger Says'
// levels: ['off', 'fatal', 'error', 'warn', 'info', 'debug', 'all']
}
if
(
options
)
{
for
(
const
key
of
Object
.
keys
(
options
))
{
logger
[
key
]
=
options
[
key
]
}
}
logger
.
levels
=
[
'off'
,
'fatal'
,
'error'
,
'warn'
,
'info'
,
'debug'
,
'all'
]
for
(
const
level
of
logger
.
levels
)
{
logger
[
level
]
=
function
()
{
if
(
!
this
.
isDev
||
typeof
console
===
'undefined'
)
return
let
levelIndex
=
logger
.
levels
.
indexOf
(
level
)
// 如果是OFF级别,则不输出日志
if
(
levelIndex
===
0
)
return
let
cLevelIndex
=
logger
.
levels
.
indexOf
(
logger
.
cLevel
)
// 如果当前级别底,则不输出日志
if
(
cLevelIndex
<
levelIndex
)
return
let
args
=
Array
.
from
(
arguments
)
args
.
unshift
(
`[
${
this
.
prefix
}
::
${
level
}
]`
.
toUpperCase
())
console
.
log
(...
args
)
}
}
Vue
.
prototype
.
$log
=
logger
if
(
window
)
window
.
logger
=
logger
}
export
default
gLogger
\ No newline at end of file
src/plugins/swiper.min.js
已删除
100644 → 0
浏览文件 @
c133db47
此差异已折叠。
点击以展开。
src/router/router.js
浏览文件 @
da310661
...
@@ -3,15 +3,18 @@ import App from '../App'
...
@@ -3,15 +3,18 @@ import App from '../App'
const
home
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/home'
)),
'home'
)
const
home
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/home'
)),
'home'
)
const
blank
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/blank'
)),
'blank'
)
const
blank
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/blank'
)),
'blank'
)
const
discuss
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/discuss/index.vue'
)),
'index'
)
const
discuss
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/discuss/index.vue'
)),
'index'
)
const
creatDiscuss
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/discuss/add-edit.vue'
)),
'creatDiscuss'
)
const
creatDiscuss
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/discuss/add-edit.vue'
)),
'creatDiscuss'
)
const
questionNaire
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/question-naire/question-list.vue'
)),
'questionNaire'
)
const
questionNaire
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/question-naire/question-list.vue'
)),
'questionNaire'
)
const
topicList
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/topicManage/index.vue'
)),
'topicList'
)
const
topicList
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/topicManage/index.vue'
)),
'topicList'
)
const
reportSet
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/report/reportSet.vue'
)),
'reportSet'
)
const
reportSet
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/report/reportSet.vue'
)),
'reportSet'
)
const
waitingSessionList
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/IM/waiting-session/list.vue'
)),
'waitingSessionList'
)
const
waitingSessionEdit
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/IM/waiting-session/edit.vue'
)),
'waitingSessionEdit'
)
const
searchMessageList
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/IM/search-message/list.vue'
)),
'waitingSessionList'
)
const
searchMessageDetail
=
r
=>
require
.
ensure
([],
()
=>
r
(
require
(
'../views/IM/search-message/detail.vue'
)),
'waitingSessionEdit'
)
export
default
[{
export
default
[{
path
:
'/'
,
path
:
'/'
,
...
@@ -20,10 +23,22 @@ export default [{
...
@@ -20,10 +23,22 @@ export default [{
{
{
path
:
''
,
path
:
''
,
redirect
:
'/home'
redirect
:
'/home'
},{
},
{
path
:
'/waiting-session-list'
,
component
:
waitingSessionList
},
{
path
:
'/waiting-session-edit'
,
component
:
waitingSessionEdit
},
{
path
:
'/search-message-list'
,
component
:
searchMessageList
},
{
path
:
'/search-message-detail'
,
component
:
searchMessageDetail
},
{
path
:
'/questionNaire'
,
path
:
'/questionNaire'
,
component
:
questionNaire
component
:
questionNaire
},{
},
{
path
:
'/home'
,
path
:
'/home'
,
component
:
home
component
:
home
},
},
...
@@ -40,14 +55,14 @@ export default [{
...
@@ -40,14 +55,14 @@ export default [{
path
:
'/question-naire'
,
path
:
'/question-naire'
,
component
:
questionNaire
component
:
questionNaire
},
},
{
{
path
:
'/topic-list'
,
path
:
'/topic-list'
,
component
:
topicList
component
:
topicList
},
},
{
{
path
:
'/report-set'
,
path
:
'/report-set'
,
component
:
reportSet
component
:
reportSet
},
},
]
]
}]
}]
\ No newline at end of file
src/style/global.scss
浏览文件 @
da310661
...
@@ -120,3 +120,7 @@
...
@@ -120,3 +120,7 @@
border-color
:
#ecedf1
;
border-color
:
#ecedf1
;
border-radius
:
2px
;
border-radius
:
2px
;
}
}
.el-button--text
>
span
{
font-weight
:
700
;
color
:
#449284
!
important
;
}
src/utils/env-config.js
浏览文件 @
da310661
...
@@ -3,13 +3,13 @@
...
@@ -3,13 +3,13 @@
*/
*/
export
const
envConfig
=
{
export
const
envConfig
=
{
development
:
{
development
:
{
//
baseUrl: 'https://dev-sc.yunqueyi.com/',
baseUrl
:
'https://dev-sc.yunqueyi.com/'
,
// // baseUrl: 'http://10.177.15.180:10202/',
// // baseUrl: 'http://10.177.15.180:10202/',
// // baseUrl: 'http://192.168.140.14:10201/',
// // baseUrl: 'http://192.168.140.14:10201/',
// baseUrl: 'https://test1-sc.yunqueyi.com/',
// baseUrl: 'https://test1-sc.yunqueyi.com/',
//baseUrl: 'https://uat-sc.yunqueyi.com/',
//baseUrl: 'https://uat-sc.yunqueyi.com/',
baseUrl
:
'https://uat-sc.yunqueyi.com'
,
//
baseUrl: 'https://uat-sc.yunqueyi.com',
qiniuFileUrl
:
"https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1"
,
qiniuFileUrl
:
"https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1"
,
qiniuResourceUrl
:
"https://test1-videos.yunqueyi.com"
,
qiniuResourceUrl
:
"https://test1-videos.yunqueyi.com"
,
...
...
src/utils/fetch.js
浏览文件 @
da310661
...
@@ -24,7 +24,6 @@ service.interceptors.request.use(config => {
...
@@ -24,7 +24,6 @@ service.interceptors.request.use(config => {
// }
// }
return
config
return
config
},
error
=>
{
},
error
=>
{
// logger.debug('service.interceptors.request: ', error)
Promise
.
reject
(
error
)
Promise
.
reject
(
error
)
})
})
...
@@ -43,8 +42,6 @@ service.interceptors.response.use(
...
@@ -43,8 +42,6 @@ service.interceptors.response.use(
//}
//}
},
},
error
=>
{
error
=>
{
// logger.error('err' + error)
return
Promise
.
reject
(
error
)
return
Promise
.
reject
(
error
)
}
}
)
)
...
...
src/utils/index.js
浏览文件 @
da310661
...
@@ -47,7 +47,7 @@ export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId
...
@@ -47,7 +47,7 @@ export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId
containerHeightId
=
'appContainerId'
,
innerHeightId
=
'elTableId'
){
containerHeightId
=
'appContainerId'
,
innerHeightId
=
'elTableId'
){
if
(
!
p_getElm
(
refHeightId
)
||
!
p_getElm
(
containerHeightId
)
||
!
p_getElm
(
innerHeightId
))
{
if
(
!
p_getElm
(
refHeightId
)
||
!
p_getElm
(
containerHeightId
)
||
!
p_getElm
(
innerHeightId
))
{
// window.onresize = null
// window.onresize = null
logger
.
warn
(
'No certain dom id!!!'
);
console
.
warn
(
'No certain dom id!!!'
);
}
}
let
containerHeight
=
p_getElm
(
refHeightId
).
getBoundingClientRect
().
height
-
50
let
containerHeight
=
p_getElm
(
refHeightId
).
getBoundingClientRect
().
height
-
50
p_getElm
(
containerHeightId
).
style
.
height
=
containerHeight
-
cMinusHeight
+
'px'
p_getElm
(
containerHeightId
).
style
.
height
=
containerHeight
-
cMinusHeight
+
'px'
...
...
src/views/IM/search-message/detail.vue
0 → 100644
浏览文件 @
da310661
此差异已折叠。
点击以展开。
src/views/IM/search-message/list.vue
0 → 100644
浏览文件 @
da310661
<
template
>
<div
class=
"message-list-wrap"
>
<bread-crumb
:curmbFirst=
"curmbFirst"
:curmbSecond=
"curmbSecond"
></bread-crumb>
<div
class=
"component-content screenSet"
id=
"screenSet"
>
<!--
<div
class=
"search-title"
>
查询条件
</div>
-->
<el-row
:gutter=
"30"
class=
"row"
type=
"flex"
style=
"margin-top: 10px;"
>
<el-form
ref=
"serchForm"
inline
:model=
"searchParam"
label-width=
"15px"
style=
"width:100%;text-align:right;"
>
<el-form-item
label=
""
>
<el-input
clearable
v-model=
"searchParam.theme"
size=
"mini"
placeholder=
"请输入用户电话"
><el-button
slot=
"append"
icon=
"el-icon-search"
></el-button></el-input>
</el-form-item>
<el-form-item
label=
""
>
<el-input
clearable
v-model=
"searchParam.name"
size=
"mini"
placeholder=
"请输入用户名称"
><el-button
slot=
"append"
icon=
"el-icon-search"
></el-button></el-input>
</el-form-item>
<el-form-item
label=
""
>
<el-input
clearable
v-model=
"searchParam.name"
size=
"mini"
placeholder=
"请输入客服名"
><el-button
slot=
"append"
icon=
"el-icon-search"
></el-button></el-input>
</el-form-item>
<el-form-item
label=
""
style=
"margin-bottom: 10px;"
>
<el-date-picker
v-model=
"searchParam.name"
size=
"mini"
type=
"date"
placeholder=
"请选择日期"
></el-date-picker>
</el-form-item>
</el-form>
</el-row>
<el-table
:data=
"tableData"
style=
"width: 100%"
v-loading=
"loading"
>
<el-table-column
prop=
"id"
label=
"用户名"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"subject"
label=
"对话次数"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"category"
label=
"用户类型"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"remark"
label=
"认证状况"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"createdusername"
label=
"所属机构"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"modifiedUsername"
label=
"备注信息"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
label=
"操作"
fixed=
"right"
align=
"center"
min-width=
"100"
>
<template
slot-scope=
"scope"
>
<el-button
type=
"text"
size=
"small"
@
click=
"edit(scope.row)"
>
查看详细
</el-button>
</
template
>
</el-table-column>
<div
slot=
"empty"
>
<div
class=
"table-empty"
>
<img
src=
"@/assets/image/no-content1.png"
/>
<p>
没有查询到相关结果
</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div
class=
"pagination"
>
<el-pagination
background
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"searchParam.pageNo"
:page-sizes=
"[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size=
"searchParam.pageSize"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"totalRows"
></el-pagination>
</div>
</div>
</div>
</template>
<
script
>
import
BreadCrumb
from
"@/components/breadcrumb.vue"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
validateWord
}
from
"@/utils/validate.js"
;
import
{
openLoading
,
closeLoading
}
from
"@/utils/utils"
;
import
*
as
commonUtil
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
components
:
{
BreadCrumb
},
data
()
{
return
{
curmbFirst
:
"客服IM"
,
curmbSecond
:
"消息查询"
,
searchParam
:
{
theme
:
""
,
type
:
""
,
name
:
""
,
status
:
""
,
pageNo
:
1
,
pageSize
:
15
},
category
:
[],
categoryStatus
:
""
,
statuSelect
:
[
{
label
:
"未发布"
,
value
:
"1"
},
{
label
:
"已发布"
,
value
:
"2"
},
{
label
:
"已下架"
,
value
:
"3"
}
],
tableData
:
[],
totalRows
:
0
,
loading
:
false
,
nextSessionId
:
""
};
},
computed
:
{},
filters
:
{
filteFun
(
index
)
{
let
str
=
""
;
if
(
index
==
1
)
{
str
=
"未发布"
;
}
else
if
(
index
==
2
)
{
str
=
"已发布"
;
}
else
if
(
index
==
3
)
{
str
=
"已下线"
;
}
return
str
;
}
},
created
()
{
this
.
getData
();
setTimeout
(()
=>
{
this
.
getData
();
},
10000
);
},
// 挂载到Dom完成时
mounted
:
function
()
{
commonUtil
.
resizeHeight
();
},
methods
:
{
// 列表查询
search
()
{
this
.
getData
();
},
// 获取数据
getData
()
{
let
subject
=
0
,
status
=
0
,
name
=
0
;
this
.
loading
=
true
;
let
cStatus
=
this
.
categoryStatus
?
this
.
categoryStatus
:
"0"
;
//'0'表示默认查所有的
let
url
=
"/interaction/discuss/"
+
cStatus
+
"/"
+
subject
+
"/"
+
name
+
"/"
+
status
+
"/"
+
this
.
searchParam
.
pageNo
+
"/"
+
this
.
searchParam
.
pageSize
;
this
.
GET
(
url
).
then
(
res
=>
{
this
.
loading
=
false
;
if
(
res
.
code
==
"000000"
)
{
console
.
log
(
res
.
data
);
this
.
tableData
=
res
.
data
.
resp
.
discuss
||
[];
this
.
nextSessionId
=
this
.
tableData
[
0
]
&&
this
.
tableData
[
0
].
id
;
console
.
log
(
"this.nextSessionId"
,
this
.
nextSessionId
);
this
.
totalRows
=
res
.
data
.
resp
.
count
;
if
(
res
.
data
.
typeList
&&
res
.
data
.
typeList
.
length
)
{
let
arr
=
[];
for
(
let
i
=
0
;
i
<
res
.
data
.
typeList
.
length
;
i
++
)
{
let
obj
=
{};
obj
.
label
=
res
.
data
.
typeList
[
i
];
obj
.
value
=
res
.
data
.
typeList
[
i
];
arr
.
push
(
obj
);
}
this
.
category
=
arr
;
}
}
});
},
// 查看消息详情
edit
()
{
this
.
$router
.
push
({
path
:
`/current-session-list?nextSessionId=
${
this
.
nextSessionId
}
`
});
},
handleSizeChange
(
value
)
{
this
.
searchParam
.
pageSize
=
value
;
this
.
getData
();
},
handleCurrentChange
(
value
)
{
this
.
searchParam
.
pageNo
=
value
;
this
.
getData
();
}
}
};
</
script
>
<
style
lang=
"scss"
scoped
>
.message-list-wrap
{
.component-content
{
padding
:
10px
;
background
:
#fff
;
// margin: 84px 20px 20px;
.search-title
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
space-between
;
padding
:
10px
12px
;
font-size
:
12px
;
margin-bottom
:
20px
;
border-bottom
:
1px
solid
#efefef
;
.num
{
color
:
#449284
;
}
}
.create-button
{
padding
:
0
0
15px
;
margin-top
:
0
!
important
;
text-align
:
right
;
}
.table-empty
{
img
{
width
:
100px
;
}
p
{
margin-top
:
-50px
;
}
}
}
}
</
style
>
\ No newline at end of file
src/views/IM/waiting-session/edit.vue
0 → 100644
浏览文件 @
da310661
此差异已折叠。
点击以展开。
src/views/IM/waiting-session/list copy.vue
0 → 100644
浏览文件 @
da310661
此差异已折叠。
点击以展开。
src/views/IM/waiting-session/list-with-pagenat.vue
0 → 100644
浏览文件 @
da310661
<
template
>
<div
class=
"wts-list-wrap"
>
<bread-crumb
:curmbFirst=
"curmbFirst"
:curmbSecond=
"curmbSecond"
></bread-crumb>
<div
class=
"component-content screenSet"
id=
"screenSet"
>
<div
class=
"search-title"
>
<p>
当前共有
<span
class=
"num"
>
5位
</span>
用户正在等待
</p>
<el-button
type=
"primary"
size=
"small"
@
click=
"getNextSession()"
>
给我一个任务吧
</el-button>
</div>
<el-table
:data=
"tableData"
style=
"width: 100%"
v-loading=
"loading"
>
<el-table-column
prop=
"id"
label=
"用户名"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"subject"
label=
"等待时间"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"category"
label=
"用户类型"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"remark"
label=
"认证状况"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"createdusername"
label=
"所属机构"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"modifiedUsername"
label=
"备注信息"
min-width=
"100"
align=
"center"
></el-table-column>
<div
slot=
"empty"
>
<div
class=
"table-empty"
>
<img
src=
"@/assets/image/no-content1.png"
/>
<p>
没有查询到相关结果
</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div
class=
"pagination"
>
<el-pagination
background
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
:current-page=
"searchParam.pageNo"
:page-sizes=
"[15, 30, 50, 100, 200, 500, 700, 1000, 1500, 2000]"
:page-size=
"searchParam.pageSize"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"totalRows"
></el-pagination>
</div>
</div>
</div>
</
template
>
<
script
>
import
BreadCrumb
from
"@/components/breadcrumb.vue"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
validateWord
}
from
"@/utils/validate.js"
;
import
{
openLoading
,
closeLoading
}
from
"@/utils/utils"
;
import
*
as
commonUtil
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
components
:
{
BreadCrumb
},
data
()
{
return
{
curmbFirst
:
"组件"
,
curmbSecond
:
"讨论组件"
,
searchParam
:
{
theme
:
""
,
type
:
""
,
name
:
""
,
status
:
""
,
pageNo
:
1
,
pageSize
:
15
},
category
:
[],
categoryStatus
:
""
,
statuSelect
:
[
{
label
:
"未发布"
,
value
:
"1"
},
{
label
:
"已发布"
,
value
:
"2"
},
{
label
:
"已下架"
,
value
:
"3"
}
],
tableData
:
[],
totalRows
:
0
,
loading
:
false
,
nextSessionId
:
''
,
};
},
computed
:
{
},
filters
:
{
filteFun
(
index
)
{
let
str
=
""
;
if
(
index
==
1
)
{
str
=
"未发布"
;
}
else
if
(
index
==
2
)
{
str
=
"已发布"
;
}
else
if
(
index
==
3
)
{
str
=
"已下线"
;
}
return
str
;
}
},
created
()
{
this
.
getData
();
},
// 挂载到Dom完成时
mounted
:
function
()
{
commonUtil
.
resizeHeight
();
},
methods
:
{
// 列表查询
search
()
{
this
.
getData
();
},
// 获取数据
getData
()
{
let
subject
=
0
,
status
=
0
,
name
=
0
;
if
(
this
.
searchParam
.
theme
!=
""
)
{
subject
=
this
.
searchParam
.
theme
;
}
if
(
this
.
searchParam
.
status
!=
""
)
{
status
=
this
.
searchParam
.
status
;
}
if
(
this
.
searchParam
.
name
!=
""
)
{
name
=
this
.
searchParam
.
name
;
}
console
.
log
(
this
.
categoryStatus
);
this
.
loading
=
true
;
let
cStatus
=
this
.
categoryStatus
?
this
.
categoryStatus
:
"0"
;
//'0'表示默认查所有的
let
url
=
"/interaction/discuss/"
+
cStatus
+
"/"
+
subject
+
"/"
+
name
+
"/"
+
status
+
"/"
+
this
.
searchParam
.
pageNo
+
"/"
+
this
.
searchParam
.
pageSize
;
this
.
GET
(
url
).
then
(
res
=>
{
this
.
loading
=
false
;
if
(
res
.
code
==
"000000"
)
{
console
.
log
(
res
.
data
);
this
.
tableData
=
res
.
data
.
resp
.
discuss
||
[];
this
.
nextSessionId
=
this
.
tableData
[
0
]
&&
this
.
tableData
[
0
].
id
;
console
.
log
(
'this.nextSessionId'
,
this
.
nextSessionId
);
this
.
totalRows
=
res
.
data
.
resp
.
count
;
if
(
res
.
data
.
typeList
&&
res
.
data
.
typeList
.
length
)
{
let
arr
=
[];
for
(
let
i
=
0
;
i
<
res
.
data
.
typeList
.
length
;
i
++
)
{
let
obj
=
{};
obj
.
label
=
res
.
data
.
typeList
[
i
];
obj
.
value
=
res
.
data
.
typeList
[
i
];
arr
.
push
(
obj
);
}
this
.
category
=
arr
;
}
}
});
},
// 给我一个任务吧
getNextSession
()
{
this
.
$router
.
push
({
path
:
`/current-session-list?nextSessionId=
${
this
.
nextSessionId
}
`
});
},
handleSizeChange
(
value
)
{
this
.
searchParam
.
pageSize
=
value
;
this
.
getData
();
},
handleCurrentChange
(
value
)
{
this
.
searchParam
.
pageNo
=
value
;
this
.
getData
();
}
}
};
</
script
>
<
style
lang=
"scss"
scoped
>
.wts-list-wrap
{
.component-content
{
padding
:
10px
;
background
:
#fff
;
// margin: 84px 20px 20px;
.search-title
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
space-between
;
padding
:
10px
12px
;
font-size
:
12px
;
margin-bottom
:
20px
;
border-bottom
:
1px
solid
#efefef
;
.num
{
color
:
#449284
;
}
}
.create-button
{
padding
:
0
0
15px
;
margin-top
:
0
!
important
;
text-align
:
right
;
}
.table-empty
{
img
{
width
:
100px
;
}
p
{
margin-top
:
-50px
;
}
}
}
}
</
style
>
\ No newline at end of file
src/views/IM/waiting-session/list.vue
0 → 100644
浏览文件 @
da310661
<
template
>
<div
class=
"wts-list-wrap"
>
<bread-crumb
:curmbFirst=
"curmbFirst"
:curmbSecond=
"curmbSecond"
></bread-crumb>
<div
class=
"component-content screenSet"
id=
"screenSet"
>
<div
class=
"search-title"
>
<p>
当前共有
<span
class=
"num"
>
{{
tableData
.
length
}}
位
</span>
用户正在等待
</p>
<el-button
type=
"primary"
size=
"small"
@
click=
"getNextSession()"
>
给我一个任务吧
</el-button>
</div>
<el-table
:data=
"tableData"
style=
"width: 100%"
v-loading=
"loading"
>
<el-table-column
prop=
"id"
label=
"用户名"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"subject"
label=
"等待时间"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"category"
label=
"用户类型"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"remark"
label=
"认证状况"
min-width=
"100"
align=
"center"
></el-table-column>
<el-table-column
prop=
"createdusername"
label=
"所属机构"
min-width=
"50"
align=
"center"
></el-table-column>
<el-table-column
prop=
"modifiedUsername"
label=
"备注信息"
min-width=
"100"
align=
"center"
></el-table-column>
<div
slot=
"empty"
>
<div
class=
"table-empty"
>
<img
src=
"@/assets/image/no-content1.png"
/>
<p>
没有查询到相关结果
</p>
</div>
</div>
</el-table>
</div>
</div>
</
template
>
<
script
>
import
BreadCrumb
from
"@/components/breadcrumb.vue"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
validateWord
}
from
"@/utils/validate.js"
;
import
{
openLoading
,
closeLoading
}
from
"@/utils/utils"
;
import
*
as
commonUtil
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
components
:
{
BreadCrumb
},
data
()
{
return
{
curmbFirst
:
"客服IM"
,
curmbSecond
:
"等待会话"
,
searchParam
:
{
theme
:
""
,
type
:
""
,
name
:
""
,
status
:
""
,
pageNo
:
1
,
pageSize
:
15
},
category
:
[],
categoryStatus
:
""
,
statuSelect
:
[
{
label
:
"未发布"
,
value
:
"1"
},
{
label
:
"已发布"
,
value
:
"2"
},
{
label
:
"已下架"
,
value
:
"3"
}
],
tableData
:
[],
totalRows
:
0
,
loading
:
false
,
nextSessionId
:
''
,
};
},
computed
:
{
},
filters
:
{
filteFun
(
index
)
{
let
str
=
""
;
if
(
index
==
1
)
{
str
=
"未发布"
;
}
else
if
(
index
==
2
)
{
str
=
"已发布"
;
}
else
if
(
index
==
3
)
{
str
=
"已下线"
;
}
return
str
;
}
},
created
()
{
this
.
getData
();
setTimeout
(()
=>
{
this
.
getData
();
},
10000
);
},
// 挂载到Dom完成时
mounted
:
function
()
{
commonUtil
.
resizeHeight
();
},
methods
:
{
// 列表查询
search
()
{
this
.
getData
();
},
// 获取数据
getData
()
{
let
subject
=
0
,
status
=
0
,
name
=
0
;
this
.
loading
=
true
;
let
cStatus
=
this
.
categoryStatus
?
this
.
categoryStatus
:
"0"
;
//'0'表示默认查所有的
let
url
=
"/interaction/discuss/"
+
cStatus
+
"/"
+
subject
+
"/"
+
name
+
"/"
+
status
+
"/"
+
this
.
searchParam
.
pageNo
+
"/"
+
this
.
searchParam
.
pageSize
;
this
.
GET
(
url
).
then
(
res
=>
{
this
.
loading
=
false
;
if
(
res
.
code
==
"000000"
)
{
console
.
log
(
res
.
data
);
this
.
tableData
=
res
.
data
.
resp
.
discuss
||
[];
this
.
nextSessionId
=
this
.
tableData
[
0
]
&&
this
.
tableData
[
0
].
id
;
console
.
log
(
'this.nextSessionId'
,
this
.
nextSessionId
);
this
.
totalRows
=
res
.
data
.
resp
.
count
;
if
(
res
.
data
.
typeList
&&
res
.
data
.
typeList
.
length
)
{
let
arr
=
[];
for
(
let
i
=
0
;
i
<
res
.
data
.
typeList
.
length
;
i
++
)
{
let
obj
=
{};
obj
.
label
=
res
.
data
.
typeList
[
i
];
obj
.
value
=
res
.
data
.
typeList
[
i
];
arr
.
push
(
obj
);
}
this
.
category
=
arr
;
}
}
});
},
// 给我一个任务吧,如果当前没有任务,则
getNextSession
()
{
this
.
$router
.
push
({
path
:
`/current-session-list?nextSessionId=
${
this
.
nextSessionId
}
`
});
},
}
};
</
script
>
<
style
lang=
"scss"
scoped
>
.wts-list-wrap
{
.component-content
{
padding
:
10px
;
background
:
#fff
;
// margin: 84px 20px 20px;
.search-title
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
space-between
;
padding
:
10px
12px
;
font-size
:
12px
;
margin-bottom
:
20px
;
border-bottom
:
1px
solid
#efefef
;
.num
{
color
:
#449284
;
}
}
.create-button
{
padding
:
0
0
15px
;
margin-top
:
0
!
important
;
text-align
:
right
;
}
.table-empty
{
img
{
width
:
100px
;
}
p
{
margin-top
:
-50px
;
}
}
}
}
</
style
>
\ No newline at end of file
src/views/discuss/index.vue
浏览文件 @
da310661
此差异已折叠。
点击以展开。
src/views/layout/footer.vue
浏览文件 @
da310661
<
template
>
<
template
>
<div
class=
"footer-wrap"
>
<div
class=
"footer-wrap"
>
<span>
Copyright© 2019 云鹊医疗科技 (上海) 有限公司
</span>
<span>
Copyright© 2019 云鹊医疗科技 (上海) 有限公司
</span>
<span>
沪ICP:16018581号-1
</span>
<span>
沪ICP:16018581号-1
</span>
<span><img
src=
"../../assets/image/footer-icon.png"
/>
京ICP备:14044861号
</span>
<span>
</div>
<img
src=
"../../assets/image/footer-icon.png"
/>
京ICP备:14044861号
</span>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
export
default
{};
}
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
.footer-wrap
{
.footer-wrap
{
text-align
:
center
;
text-align
:
center
;
height
:
75px
;
height
:
75px
;
line-height
:
75px
;
line-height
:
75px
;
font-size
:
12px
;
font-size
:
12px
;
color
:
#838486
;
color
:
#838486
;
span
{
span
{
padding
:
0
10px
;
padding
:
0
10px
;
}
}
img
{
img
{
width
:
12px
;
width
:
12px
;
padding-right
:
5px
;
padding-right
:
5px
;
}
}
}
}
</
style
>
</
style
>
src/views/layout/header.vue
浏览文件 @
da310661
此差异已折叠。
点击以展开。
src/views/layout/slidebar.vue
浏览文件 @
da310661
<
template
>
<
template
>
<div
id=
"slidebar-container"
class=
"slidebar-container"
>
<div
id=
"slidebar-container"
class=
"slidebar-container"
>
<el-menu
:default-active=
"onRoutes"
class=
"el-menu-vertical-demo"
theme=
"dark"
unique-opened
router
>
<el-menu
<template
v-for=
"(item,_index) in items"
>
:default-active=
"onRoutes"
<template
v-if=
"item.subs && item.subs.length"
>
class=
"el-menu-vertical-demo"
<el-submenu
:index=
" 'index_' + _index"
:key=
"item.index"
>
theme=
"dark"
<template
slot=
"title"
><i
:class=
"item.icon"
></i>
{{
item
.
title
}}
</
template
>
unique-opened
<el-menu-item
v-for=
"(subItem,i) in item.subs"
:key=
"i"
:index=
"subItem.index"
>
router
<i
class=
"sub-icon"
:class=
"subItem.icon"
></i>
>
{{subItem.title}}
<template
v-for=
"(item,_index) in items"
>
</el-menu-item>
<template
v-if=
"item.subs && item.subs.length"
>
</el-submenu>
<el-submenu
:index=
" 'index_' + _index"
:key=
"item.index"
>
</template>
<template
slot=
"title"
>
<
template
v-else
>
<i
:class=
"item.icon"
></i>
<el-menu-item
:index=
"item.index"
:key=
"item.index"
>
{{
item
.
title
}}
<i
:class=
"item.icon"
></i>
{{
item
.
title
}}
</el-menu-item>
</
template
>
</
template
>
</
template
>
</el-menu>
<el-menu-item
v-for=
"(subItem,i) in item.subs"
:key=
"i"
:index=
"subItem.index"
>
</div>
<i
class=
"sub-icon"
:class=
"subItem.icon"
></i>
{{subItem.title}}
</el-menu-item>
</el-submenu>
</template>
<
template
v-else
>
<el-menu-item
:index=
"item.index"
:key=
"item.index"
>
<i
:class=
"item.icon"
></i>
{{
item
.
title
}}
</el-menu-item>
</
template
>
</template>
</el-menu>
</div>
</template>
</template>
<
script
>
<
script
>
import
{
mapGetters
}
from
'vuex'
import
{
mapGetters
}
from
"vuex"
;
import
{
setTimeout
}
from
'timers'
import
{
setTimeout
}
from
"timers"
;
import
{
isNotEmptyUtils
}
from
'../../utils/utils'
import
{
isNotEmptyUtils
}
from
"../../utils/utils"
;
let
vm
=
null
let
vm
=
null
;
export
default
{
export
default
{
props
:
{
props
:
{
tokenValue
:
{
tokenValue
:
{
type
:
String
type
:
String
}
}
},
},
data
()
{
data
()
{
return
{
return
{
items
:
[],
items
:
[]
// items:[{title:'组件',icon:'el-icon-menu',index:'item',subs:[{title:'讨论组件',icon:'el-icon-setting',index:'discuss-list'},{title:"问卷管理",icon:"el-icon-setting",index:"question-naire"},{title:"举报管理",icon:"el-icon-setting",index:"report-set"}]},]
// items:[{title:'组件',icon:'el-icon-menu',index:'item',subs:[{title:'讨论组件',icon:'el-icon-setting',index:'discuss-list'},{title:"问卷管理",icon:"el-icon-setting",index:"question-naire"},{title:"举报管理",icon:"el-icon-setting",index:"report-set"}]},]
}
};
},
},
computed
:
{
computed
:
{
onRoutes
()
{
onRoutes
()
{
return
this
.
$route
.
path
.
replace
(
'/'
,
''
);
return
this
.
$route
.
path
.
replace
(
"/"
,
""
);
}
}
},
},
created
()
{
created
()
{
vm
=
this
vm
=
this
;
const
navs
=
sessionStorage
.
getItem
(
'DISCUSS_CENTER_NAVS'
)
const
navs
=
sessionStorage
.
getItem
(
"DISCUSS_CENTER_NAVS"
);
vm
.
getNav
()
vm
.
getNav
();
},
},
methods
:
{
methods
:
{
getNav
()
{
getNav
()
{
this
.
POST
(
'/basic-data/menu/list'
,
{
systemType
:
26
}).
then
(
res
=>
{
this
.
POST
(
"basic-data/menu/list"
,
{
systemType
:
26
}).
then
(
res
=>
{
if
(
res
.
code
==
'000000'
)
{
if
(
res
.
code
==
"000000"
)
{
cons
t
{
vueMenuDtos
}
=
res
.
data
;
le
t
{
vueMenuDtos
}
=
res
.
data
;
this
.
items
=
vueMenuDtos
;
// TODO 开发调试时写死, 发布时去掉
sessionStorage
.
setItem
(
'DISCUSS_CENTER_NAVS'
,
JSON
.
stringify
(
vueMenuDtos
));
vueMenuDtos
=
[{
// 做当前路由无权限时处理
icon
:
null
,
this
.
checkAuth
(
this
.
$route
.
path
.
split
(
'/'
)[
1
],
vueMenuDtos
);
index
:
"waiting-session-list"
,
}
subs
:
[],
});
title
:
"等待会话"
},
},{
checkAuth
(
path
,
navs
)
{
icon
:
null
,
let
navList
=
getNavs
(
navs
);
index
:
"waiting-session-list-1"
,
subs
:
[],
title
:
"当前会话"
},{
icon
:
null
,
index
:
"search-message-list"
,
subs
:
[],
title
:
"消息查询"
},{
icon
:
null
,
index
:
"waiting-session-list-3"
,
subs
:
[],
title
:
"我要群发"
},{
icon
:
null
,
index
:
"waiting-session-list-4"
,
subs
:
[],
title
:
"历史群发"
}];
this
.
items
=
vueMenuDtos
;
sessionStorage
.
setItem
(
"DISCUSS_CENTER_NAVS"
,
JSON
.
stringify
(
vueMenuDtos
)
);
// 做当前路由无权限时处理
this
.
checkAuth
(
this
.
$route
.
path
.
split
(
"/"
)[
1
],
vueMenuDtos
);
}
});
},
checkAuth
(
path
,
navs
)
{
let
navList
=
getNavs
(
navs
);
function
getNavs
(
arr
)
{
function
getNavs
(
arr
)
{
let
nvs
=
[];
let
nvs
=
[];
for
(
let
i
=
0
;
i
<
arr
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
arr
.
length
;
i
++
)
{
const
nav
=
arr
[
i
];
const
nav
=
arr
[
i
];
const
subs
=
nav
.
subs
;
const
subs
=
nav
.
subs
;
if
(
subs
.
length
)
{
if
(
subs
.
length
)
{
nvs
=
nvs
.
concat
(
getNavs
(
subs
));
nvs
=
nvs
.
concat
(
getNavs
(
subs
));
}
else
{
}
else
{
nvs
.
push
(
nav
.
index
);
nvs
.
push
(
nav
.
index
);
}
}
}
return
nvs
;
}
debugger
if
(
navList
.
indexOf
(
path
)
==
-
1
)
{
this
.
$router
.
push
(
`/
${
navList
[
0
]}
`
);
}
}
return
nvs
;
}
if
(
navList
.
indexOf
(
path
)
==
-
1
)
{
this
.
$router
.
push
(
`/
${
navList
[
0
]}
`
);
}
}
}
}
}
}
};
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
.slidebar-container
{
.slidebar-container
{
display
:
block
;
display
:
block
;
position
:
absolute
;
position
:
absolute
;
left
:
0
;
left
:
0
;
top
:
64px
;
top
:
64px
;
bottom
:
0
;
bottom
:
0
;
width
:
255px
;
width
:
255px
;
background
:
#06232C
;
background
:
#06232c
;
.el-menu
{
.el-menu
{
background
:
#06232C
;
background
:
#06232c
;
border-right
:
none
;
border-right
:
none
;
.sub-icon
{
.sub-icon
{
font-size
:
12px
;
font-size
:
12px
;
}
}
.el-menu-item
,
.el-submenu__title
{
.el-menu-item
,
color
:
#8FA4AC
;
.el-submenu__title
{
}
color
:
#8fa4ac
;
.el-menu-item.is-active
{
}
color
:
#fff
;
.el-menu-item.is-active
{
background
:
#509284
!
important
color
:
#fff
;
}
background
:
#509284
!
important
;
.el-menu-item
:hover
,
}
.el-submenu__title
:hover
,
.el-menu-item
:hover
,
.slidebar-container
.el-menu
.el-menu-item
:hover
,
.el-submenu__title
:hover
,
.slidebar-container
.el-menu
.el-submenu__title
:hover
{
.slidebar-container
.el-menu
.el-menu-item
:hover
,
color
:
#fff
;
.slidebar-container
.el-menu
.el-submenu__title
:hover
{
background
:
#06232C
;
color
:
#fff
;
}
background
:
#06232c
;
// .el-menu-item:focus, .el-menu-item:hover {
// background: #06232C !important;
// }
}
}
// .el-menu-item:focus, .el-menu-item:hover {
// background: #06232C !important;
// }
}
}
}
</
style
>
</
style
>
...
...
写
预览
Markdown
格式
0%
请重试
or
附加一个文件
附加文件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录