Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
P
pica-admin-IM
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
Close sidebar
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
com.pica.cloud.education.frontend
pica-admin-IM
提交
08ea5e69
提交
08ea5e69
编写于
1月 20, 2021
作者:
guangjun.yang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
问题修改等
上级
3a0ecdaa
变更
6
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
191 行增加
和
20 行删除
+191
-20
common.js
src/store/im/common.js
+5
-1
getters.js
src/store/im/getters.js
+1
-0
filter.js
src/utils/filter.js
+31
-1
index.vue
src/views/IM/current-session/index.vue
+41
-18
test.html
src/views/IM/current-session/test.html
+110
-0
list.vue
src/views/IM/waiting-session/list.vue
+3
-0
未找到文件。
src/store/im/common.js
浏览文件 @
08ea5e69
...
...
@@ -4,7 +4,8 @@ const common = {
// 问题归类
stickerCacheMap
:
{
}
},
isFromAssignTask
:
false
,
},
mutations
:
{
CHANGE_TOKEN
:
(
state
,
data
)
=>
{
...
...
@@ -13,6 +14,9 @@ const common = {
SET_STICKER_CACHE_MAP
:
(
state
,
chcheMap
)
=>
{
state
.
stickerCacheMap
[
chcheMap
.
key
]
=
chcheMap
.
idList
;
},
SET_IS_FROM_ASSIGN_TASK
:
(
state
,
status
)
=>
{
state
.
isFromAssignTask
=
status
;
}
},
actions
:
{
changeToken
({
commit
},
tokenData
)
{
...
...
src/store/im/getters.js
浏览文件 @
08ea5e69
...
...
@@ -2,6 +2,7 @@
const
getters
=
{
_token
:
state
=>
state
.
common
.
_token
,
stickerCacheMap
:
state
=>
state
.
common
.
stickerCacheMap
,
isFromAssignTask
:
state
=>
state
.
common
.
isFromAssignTask
,
}
export
default
getters
src/utils/filter.js
浏览文件 @
08ea5e69
...
...
@@ -3,6 +3,27 @@ const vueFilter = {
if
(
!
value
)
return
''
;
return
new
Date
(
value
).
format
(
"yyyy-MM-dd hh:mm:ss"
);
},
continueTimesFilter
:
(
value
)
=>
{
if
(
!
value
)
return
''
;
var
duration
=
value
/
1000
;
var
s
=
Math
.
floor
(
duration
%
60
).
toString
();
if
(
s
.
length
<
2
)
{
s
=
'0'
+
s
;
}
var
m
=
Math
.
floor
((
duration
%
3600
)
/
60
).
toString
();
if
(
m
.
length
<
2
)
{
m
=
'0'
+
m
;
}
var
h
=
Math
.
floor
(
duration
/
60
/
60
).
toString
();
if
(
h
.
length
<
2
)
{
h
=
'0'
+
h
;
}
if
(
parseInt
(
h
)
>=
1
)
{
return
h
+
'时'
+
m
+
'分'
+
s
+
'秒'
;
}
else
{
return
m
+
'分'
+
s
+
'秒'
;
}
},
liveFilter
:
(
value
)
=>
{
if
(
value
.
liveStatus
==
1
)
{
return
'未开始'
...
...
@@ -201,6 +222,15 @@ const vueFilter = {
}
// $time.innerHTML = result;
return
result
;
}
},
// 将字符串截短至指定长度,并用在最后追加特定字符串(例如:...)
shortName
:
function
(
value
,
length
=
10
,
append
=
'...'
)
{
if
(
value
&&
value
.
length
>
length
)
{
return
value
.
substring
(
0
,
length
)
+
append
}
else
{
return
value
}
},
}
export
default
vueFilter
\ No newline at end of file
src/views/IM/current-session/index.vue
浏览文件 @
08ea5e69
...
...
@@ -22,10 +22,10 @@
<div
class=
"desc"
>
<div
class=
"top"
>
<span
class=
"name"
>
{{
session
.
toName
}}
</span>
<span
class=
"time small"
>
{{
session
.
lastMsgTime
|
timeFormat
}}
</span>
<span
class=
"time small"
>
{{
session
.
timestampStr
}}
</span>
</div>
<div
class=
"bottom"
>
<span>
{{
session
.
text
}}
</span>
<span>
{{
session
.
text
|
shortName
}}
</span>
<!--
<span>
{{
session
.
lastMsgContent
}}
</span>
-->
<span
v-show=
"session.status !=3 && currentTaskLogId != session.taskLogId && session.unreadCount"
...
...
@@ -46,7 +46,7 @@
<div
class=
"c-header-l"
>
<img
:src=
"currentSession.avatarImageUrl"
alt
/>
<span
class=
"name"
>
{{
doctorInfo
.
name
}}
</span>
<span
class=
"time-tip"
>
当前会话时长:
3分08秒
</span>
<span
class=
"time-tip"
>
当前会话时长:
{{
currentContinueTimes
|
continueTimesFilter
}}
</span>
</div>
<!--
<span
class=
"close-btn"
>
结束会话
</span>
-->
</section>
...
...
@@ -62,7 +62,7 @@
<img
:src=
"item.avatarImg"
alt
/>
</div>
<div
class=
"msg-item-detail"
>
<span
class=
"mid-time"
>
{{
item
.
timestamp
|
timeFormat
}}
</span>
<span
class=
"mid-time"
>
{{
item
.
timestamp
Str
}}
</span>
<div
v-if=
"item.showType == 1"
class=
"mid-text-wrapper"
style=
"max-width: 520px;"
>
<img
v-show=
"item.sendFlag"
src=
"../../../assets/image/IM/icon-no-send.png"
alt
/>
<div
class=
"mid-text"
>
{{
item
.
text
}}
</div>
...
...
@@ -75,7 +75,7 @@
<div
v-if=
"item.showType == 3"
class=
"mid-pdf"
@
click=
"openPDF(item)"
>
<div
class=
"midp-left"
>
<span
class=
"name"
>
{{
item
.
text
}}
</span>
<span
class=
"size"
>
{{
item
.
size
}}
MB
</span>
<span
class=
"size"
>
{{
fileSizeChange
(
item
.
size
)
}}
</span>
</div>
<div
class=
"midp-icon"
>
<img
src=
"../../../assets/image/IM/icon-pdf.png"
alt
/>
...
...
@@ -93,7 +93,7 @@
</article>
</section>
<section
class=
"c-bottom"
>
<el-input
type=
"textarea"
placeholder=
"请输入内容"
v-model=
"sendText"
></el-input>
<el-input
type=
"textarea"
placeholder=
"请输入内容"
v-model=
"sendText"
maxlength=
499
></el-input>
<div
class=
"cb-icon-wrapper"
>
<el-upload
class=
"bg-uploader"
...
...
@@ -129,12 +129,12 @@
<el-form
ref=
"linkFormRef"
:rules=
"rules"
:model=
"linkForm"
label-width=
"100px"
>
<el-form-item
label=
"普通文本"
>
<el-col
:span=
"20"
>
<el-input
v-model=
"linkForm.remark"
size=
"small"
maxlength=
"
2
0"
></el-input>
<el-input
v-model=
"linkForm.remark"
size=
"small"
maxlength=
"
30
0"
></el-input>
</el-col>
</el-form-item>
<el-form-item
label=
"链接文案"
prop=
"info"
>
<el-col
:span=
"20"
>
<el-input
v-model=
"linkForm.info"
size=
"small"
maxlength=
"
2
0"
></el-input>
<el-input
v-model=
"linkForm.info"
size=
"small"
maxlength=
"
10
0"
></el-input>
</el-col>
</el-form-item>
<el-form-item
label=
"链接地址"
prop=
"url"
>
...
...
@@ -165,19 +165,18 @@
</div>
</
template
>
<
script
>
// import { mapGetter
s } from 'vuex';
import
{
mapGetters
,
mapMutation
s
}
from
'vuex'
;
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 { openLoading, closeLoading } from "@/utils/utils";
import
{
openLoading
,
closeLoading
,
betaHandle
,
timeHandle
}
from
"@/utils/utils"
;
import
*
as
commonUtil
from
"@/utils/utils"
;
import
{
getPicaKFAccid
,
getPhomeDemain
}
from
"@/utils"
;
import
UserInfo
from
"@/components/IM/user-info.vue"
;
const
CONTAINER_HEIGHT
=
700
;
let
forwardMsgIntervalId
=
null
;
let
sessionIntervalId
=
null
;
let
currentTimestamp
=
0
;
let
currentContinueTimes
=
0
;
let
continueIntervalId
=
null
;
let
_this
=
null
;
...
...
@@ -190,13 +189,14 @@ export default {
return
{
curmbFirst
:
"云鹊客服"
,
curmbSecond
:
"当前会话"
,
// currentTimestamp: 0,
sendText
:
""
,
sessionListData
:
{
currentTimestamp
:
0
,
myTaskCount
:
0
,
sessionList
:
[],
waitingTaskCount
:
0
},
currentContinueTimes
:
0
,
currentSessionIndex
:
0
,
// 当前会话序号
currentSession
:
{},
currentTaskLogId
:
""
,
// 当前会话ID
...
...
@@ -227,7 +227,7 @@ export default {
},
computed
:
{
// ...mapGetters(['stickerCacheMap
']),
...
mapGetters
([
'isFromAssignTask
'
]),
canSend
()
{
return
!!
this
.
sendText
;
}
...
...
@@ -320,6 +320,10 @@ export default {
},
methods
:
{
//
...
mapMutations
([
'SET_IS_FROM_ASSIGN_TASK'
]),
// 下拉刷新
loadmore
()
{
console
.
log
(
"in loadmore..."
);
...
...
@@ -452,6 +456,7 @@ export default {
)
{
content
=
JSON
.
parse
(
msg
.
content
);
url
=
content
.
url
;
text
=
content
.
name
;
showType
=
2
;
}
else
{
showType
=
1
;
...
...
@@ -471,6 +476,11 @@ export default {
const
scrollBoxDom
=
document
.
querySelector
(
'.scroll-box'
)
scrollBoxDom
.
scrollTop
=
200000
;
});
this
.
currentContinueTimes
=
this
.
sessionListData
.
currentTimestamp
-
this
.
currentSession
.
handleStartTime
;
continueIntervalId
&&
clearInterval
(
continueIntervalId
);
continueIntervalId
=
setInterval
(()
=>
{
this
.
currentContinueTimes
+=
1000
;
},
1000
);
}
else
if
(
directFlag
===
2
)
{
this
.
messageList
.
push
(...
cMessageList
);
}
else
{
...
...
@@ -522,6 +532,7 @@ export default {
fetchOneTask
()
{
this
.
GET
(
"/im/session/kf/fetchOneTask"
).
then
(
res
=>
{
if
(
res
.
code
===
"000000"
)
{
this
.
SET_IS_FROM_ASSIGN_TASK
(
true
);
this
.
currentTaskLogId
=
""
;
this
.
getSessionList
();
}
else
{
...
...
@@ -539,21 +550,27 @@ export default {
if
(
res
.
code
===
"000000"
)
{
console
.
log
(
"in getSessionList"
,
res
);
this
.
sessionListData
=
res
.
data
||
{
currentTimestamp
:
0
,
myTaskCount
:
0
,
sessionList
:
[],
waitingTaskCount
:
0
};
let
sLength
=
this
.
sessionListData
.
sessionList
.
length
;
let
cIndex
=
sLength
-
1
;
if
(
!
this
.
isFromAssignTask
)
{
cIndex
=
0
;
}
// 第一次进入页面
if
(
sLength
&&
!
this
.
currentTaskLogId
)
{
// this.currentSession = this.sessionListData.sessionList[0];
// this.currentSessionIndex = 0;
this
.
currentSession
=
this
.
sessionListData
.
sessionList
[
sLength
-
1
];
this
.
currentSessionIndex
=
sLength
-
1
;
this
.
currentSession
=
this
.
sessionListData
.
sessionList
[
cIndex
];
this
.
currentSessionIndex
=
cIndex
;
this
.
currentTaskLogId
=
this
.
currentSession
.
taskLogId
;
this
.
currentToAccId
=
this
.
currentSession
.
toAccId
;
this
.
getDoctorInfo
(
this
.
currentToAccId
);
this
.
getMSGHistory
(
this
.
currentSession
);
this
.
SET_IS_FROM_ASSIGN_TASK
(
false
);
}
if
(
sLength
)
{
this
.
convertSessions
(
this
.
sessionListData
.
sessionList
);
...
...
@@ -582,7 +599,7 @@ export default {
text
=
cc
.
title
;
// } else if (cc.showType == 18) {
}
else
{
text
=
cc
.
content
||
""
;
text
=
cc
.
content
||
cc
.
name
;
}
// if (cc.showType != 8) {
// text = `${text}`;
...
...
@@ -698,6 +715,7 @@ export default {
// 上传文件
beforeUploadFile
(
file
)
{
console
.
log
(
"file"
,
file
);
doUpload
(
_this
,
file
,
...
...
@@ -792,7 +810,12 @@ export default {
});
}
});
}
},
// 文件大小单位转换
fileSizeChange
(
val
)
{
return
betaHandle
(
val
)
},
},
beforeDestroy
()
{
...
...
src/views/IM/current-session/test.html
0 → 100644
浏览文件 @
08ea5e69
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"utf-8"
>
<title></title>
<style
type=
"text/css"
>
html
,
body
{
height
:
100%
;
}
body
,
ul
,
li
,
a
,
p
,
div
{
padding
:
0px
;
margin
:
0px
;
font-size
:
14px
;}
#wrap
{
overflow
:
hidden
;
width
:
100%
;
}
#main
{
height
:
2944px
;
top
:
0
;
position
:
relative
;
}
.page
{
width
:
100%
;
margin
:
0
;
}
#page1
{
background
:
#E4E6CE
;
}
#page2
{
background
:
#6CE26C
;
}
#page3
{
background
:
#BF4938
;
}
#page4
{
background
:
#2932E1
;
}
</style>
<!-- <script src="js/jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script> -->
</head>
<body>
<div
id=
"wrap"
>
<div
id=
"main"
>
<div
id=
"page1"
class=
"page"
></div>
<div
id=
"page2"
class=
"page"
></div>
<div
id=
"page3"
class=
"page"
></div>
<div
id=
"page4"
class=
"page"
></div>
</div>
</div>
<script
type=
"text/javascript"
>
var
wrap
=
document
.
getElementById
(
"wrap"
);
var
main
=
document
.
getElementById
(
"main"
);
var
hei
=
document
.
body
.
clientHeight
;
wrap
.
style
.
height
=
hei
+
"px"
;
var
obj
=
document
.
getElementsByTagName
(
"div"
);
for
(
var
i
=
0
;
i
<
obj
.
length
;
i
++
){
if
(
obj
[
i
].
className
==
'page'
){
obj
[
i
].
style
.
height
=
hei
+
"px"
;
}
}
//如果不加时间控制,滚动会过度灵敏,一次翻好几屏
var
startTime
=
0
,
//翻屏起始时间
endTime
=
0
,
now
=
0
;
//浏览器兼容
if
((
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
"firefox"
)
!=-
1
)){
document
.
addEventListener
(
"DOMMouseScroll"
,
scrollFun
,
false
);
}
else
if
(
document
.
addEventListener
)
{
document
.
addEventListener
(
"mousewheel"
,
scrollFun
,
false
);
}
else
if
(
document
.
attachEvent
)
{
document
.
attachEvent
(
"onmousewheel"
,
scrollFun
);
}
else
{
document
.
onmousewheel
=
scrollFun
;
}
//滚动事件处理函数
function
scrollFun
(
event
){
startTime
=
new
Date
().
getTime
();
var
delta
=
event
.
detail
||
(
-
event
.
wheelDelta
);
//mousewheel事件中的 “event.wheelDelta” 属性值:返回的如果是正值说明滚轮是向上滚动
//DOMMouseScroll事件中的 “event.detail” 属性值:返回的如果是负值说明滚轮是向上滚动
if
((
endTime
-
startTime
)
<
-
1000
){
if
(
delta
>
0
&&
parseInt
(
main
.
offsetTop
)
>
-
(
hei
*
3
)){
//向下滚动
now
=
now
-
hei
;
toPage
(
now
);
}
if
(
delta
<
0
&&
parseInt
(
main
.
offsetTop
)
<
0
){
//向上滚动
now
=
now
+
hei
;
toPage
(
now
);
}
endTime
=
new
Date
().
getTime
();
}
else
{
event
.
preventDefault
();
}
}
function
toPage
(
now
){
// $("#main").animate({top:(now+'px')},1000); //jquery实现动画效果
setTimeout
(
"main.style.top = now + 'px'"
,
1000
);
//javascript 实现动画效果
}
</script>
</body>
</html>
src/views/IM/waiting-session/list.vue
浏览文件 @
08ea5e69
...
...
@@ -27,6 +27,7 @@
</div>
</template>
<
script
>
import
{
mapGetters
,
mapMutations
}
from
'vuex'
;
import
BreadCrumb
from
"@/components/breadcrumb.vue"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
validateWord
}
from
"@/utils/validate.js"
;
...
...
@@ -73,6 +74,7 @@ export default {
},
methods
:
{
...
mapMutations
([
'SET_IS_FROM_ASSIGN_TASK'
]),
// 获取数据
getListData
()
{
this
.
loading
=
true
;
...
...
@@ -94,6 +96,7 @@ export default {
getNextSession
()
{
this
.
GET
(
'/im/session/kf/fetchOneTask'
).
then
((
res
)
=>
{
if
(
res
.
code
===
'000000'
)
{
this
.
SET_IS_FROM_ASSIGN_TASK
(
true
);
this
.
$router
.
push
({
path
:
`/current-session-list`
});
}
else
{
this
.
$message
({
...
...
写
预览
Markdown
格式
0%
请重试
or
附加一个文件
附加文件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录