Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fns_front_2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chenqikuai
fns_front_2
Commits
7305f4b7
Commit
7305f4b7
authored
Dec 08, 2021
by
chenqikuai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: 通过role2判断角色,将管理员从原先的用户中区分出来。因为管理员可以聊天了。
原先通过role来判断角色,user包含客户和管理员,staff包含客户经理。现在由于管理员的功能等同于客户经理,所以通过角色分割更加明晰的role2来判断。role2中user是客户,staff是客户经理,manager是管理员
parent
43bb188f
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
345 additions
and
290 deletions
+345
-290
ChatListItem.vue
src/components/ChatList/ChatListItem.vue
+110
-88
ChatListCardDB.ts
src/db/ChatListCardDB.ts
+54
-53
index.ts
src/router/index.ts
+5
-2
authCheck.ts
src/utils/authCheck.ts
+14
-16
displayName.ts
src/utils/displayName.ts
+8
-8
live.ts
src/utils/live.ts
+24
-24
userMsg.ts
src/utils/userMsg.ts
+5
-2
Chat.vue
src/views/Chat/Chat.vue
+1
-1
ChatContentMessage.vue
src/views/Chat/ChatContentMessage.vue
+72
-39
ChatContentMessageCard.vue
src/views/Chat/ChatContentMessageCard.vue
+25
-24
ChatInput.vue
src/views/Chat/ChatInput.vue
+1
-2
index.vue
src/views/withMenu/ChatList/index.vue
+4
-6
index.vue
src/views/withMenu/Mine/index.vue
+1
-4
tabList.ts
src/views/withMenu/tabList.ts
+21
-21
No files found.
src/components/ChatList/ChatListItem.vue
View file @
7305f4b7
<
template
>
<div
class=
"flex chatlistitem relative -mr-1"
>
<div
class=
"self-center mr-4 flex-shrink-0"
>
<img
v-if=
"userType === eRole.staff"
class=
"w-10 h-10 rounded-md object-cover"
src=
"@/assets/icons/avatar.png"
alt=
"avatar"
/>
<img
v-else-if=
"isRobootCard"
class=
"w-10 h-10 rounded-md object-contain"
:class=
"
{'filterGray': isDeleted}"
src="@/assets/img/roboot.png"
alt="avatar"
/>
<img
v-else-if=
"!isRobootCard"
class=
"w-10 h-10 rounded-md object-contain"
src=
"@/assets/icons/staff.png"
alt=
"avatar"
/>
<div
class=
"flex chatlistitem relative -mr-1"
>
<div
class=
"self-center mr-4 flex-shrink-0"
>
<img
v-if=
"userType !== eRole.user"
class=
"w-10 h-10 rounded-md object-cover"
src=
"@/assets/icons/avatar.png"
alt=
"avatar"
/>
<img
v-else-if=
"isRobootCard"
class=
"w-10 h-10 rounded-md object-contain"
:class=
"
{ filterGray: isDeleted }"
src="@/assets/img/roboot.png"
alt="avatar"
/>
<img
v-else-if=
"!isRobootCard"
class=
"w-10 h-10 rounded-md object-contain"
src=
"@/assets/icons/staff.png"
alt=
"avatar"
/>
</div>
<div
class=
"flex-grow right-box overflow-hidden pr-1"
>
<div
class=
"flex justify-between mt-5"
>
<div
class=
"
id
whitespace-nowrap
overflow-hidden overflow-ellipsis
flex-grow flex-shrink
"
>
{{
displayName
}}
</div>
<div
class=
"
txt
whitespace-nowrap
overflow-hidden overflow-ellipsis
flex-shrink-0
"
>
{{
datetime
&&
timestampFormat2
(
datetime
)
}}
</div>
<div
class=
"flex-grow right-box overflow-hidden pr-1"
>
<div
class=
"flex justify-between mt-5"
>
<div
class=
"id whitespace-nowrap overflow-hidden overflow-ellipsis flex-grow flex-shrink"
>
{{
displayName
}}
</div>
<div
class=
"txt whitespace-nowrap overflow-hidden overflow-ellipsis flex-shrink-0"
>
{{
datetime
&&
timestampFormat2
(
datetime
)
}}
</div>
</div>
<div
class=
"flex justify-between mb-5 mt-1"
>
<div
class=
"overflow-hidden overflow-ellipsis whitespace-nowrap txt"
>
{{
latest_msg_content
}}
</div>
<div
v-if=
"unReadMsgNum"
class=
"dot flex items-center justify-center rounded-full flex-shrink-0 flex-grow-0 px-1"
>
{{
unReadMsgNum
}}
</div>
</div>
</div>
<div
class=
"flex justify-between mb-5 mt-1"
>
<div
class=
"overflow-hidden overflow-ellipsis whitespace-nowrap txt"
>
{{
latest_msg_content
}}
</div>
<div
v-if=
"unReadMsgNum"
class=
"
dot
flex
items-center
justify-center
rounded-full
flex-shrink-0 flex-grow-0
px-1
"
>
{{
unReadMsgNum
}}
</div>
</div>
</div>
</div>
</
template
>
<
script
setup
lang=
"ts"
>
import
{
eRole
}
from
"@/types/roleType"
;
...
...
@@ -48,55 +72,54 @@ import { timestampFormat2 } from "@/utils/time";
import
{
PropType
}
from
"@vue/runtime-core"
;
const
props
=
defineProps
({
avatar_url
:
{
type
:
String
,
default
:
'--'
},
id
:
{
type
:
String
,
default
:
'--'
},
latest_msg_content
:
{
type
:
String
,
default
:
'--'
},
unReadMsgNum
:
{
type
:
Number
,
default
:
10
},
displayName
:
String
,
datetime
:
{
type
:
Number
,
},
userType
:
{
type
:
Number
as
PropType
<
eRole
>
},
isRobootCard
:
{
type
:
Boolean
},
isDeleted
:
{
type
:
Boolean
}
})
avatar_url
:
{
type
:
String
,
default
:
"--"
},
id
:
{
type
:
String
,
default
:
"--"
},
latest_msg_content
:
{
type
:
String
,
default
:
"--"
},
unReadMsgNum
:
{
type
:
Number
,
default
:
10
,
},
displayName
:
String
,
datetime
:
{
type
:
Number
,
},
userType
:
{
type
:
Number
as
PropType
<
eRole
>
,
},
isRobootCard
:
{
type
:
Boolean
,
},
isDeleted
:
{
type
:
Boolean
,
},
});
</
script
>
<
style
lang=
"less"
>
.chatlistitem {
.id {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
}
.txt {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #8d92af;
}
.dot {
height: 20px;
min-width: 20px;
background: #f03a30;
box-shadow: 0px 4px 6px 0px rgba(240, 58, 48, 0.5);
font-size: 12px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #ffffff;
}
.right-box {
border-bottom: 1px solid #eaeaeb;
}
.id {
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
}
.txt {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #8d92af;
}
.dot {
height: 20px;
min-width: 20px;
background: #f03a30;
box-shadow: 0px 4px 6px 0px rgba(240, 58, 48, 0.5);
font-size: 12px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #ffffff;
}
.right-box {
border-bottom: 1px solid #eaeaeb;
}
}
</
style
>
\ No newline at end of file
</
style
>
src/db/ChatListCardDB.ts
View file @
7305f4b7
import
{
DisplayMessage
}
from
'@/store/messagesStore'
import
{
ChatMessageTypes
}
from
'@/types/chatMessageTypes'
import
{
eRole
}
from
'@/types/roleType'
import
ChatDataService
from
'@/utils/ChatDataService'
import
{
DisplayMessage
}
from
"@/store/messagesStore"
;
import
{
ChatMessageTypes
}
from
"@/types/chatMessageTypes"
;
import
{
eRole
}
from
"@/types/roleType"
;
import
ChatDataService
from
"@/utils/ChatDataService"
;
import
{
getMasterIdFromDisplayMsg
,
getTargetIdFromDisplayMsg
,
}
from
'@/utils/chatutils'
import
{
getUserMsg
}
from
'@/utils/userMsg'
import
{
iChatListCard
,
MyAppDatabase
}
from
'./index'
}
from
"@/utils/chatutils"
;
import
{
getUserMsg
}
from
"@/utils/userMsg"
;
import
{
iChatListCard
,
MyAppDatabase
}
from
"./index"
;
export
default
class
ChatListCardDB
extends
MyAppDatabase
{
static
instance
:
ChatListCardDB
static
instance
:
ChatListCardDB
;
static
getInstance
()
{
if
(
!
ChatListCardDB
.
instance
)
{
ChatListCardDB
.
instance
=
new
ChatListCardDB
()
ChatListCardDB
.
instance
=
new
ChatListCardDB
()
;
}
return
ChatListCardDB
.
instance
return
ChatListCardDB
.
instance
;
}
saveCard
(
item
:
iChatListCard
)
{
return
this
.
chatListCard
.
add
({
...
item
})
return
this
.
chatListCard
.
add
({
...
item
})
;
}
deleteCard
(
masterId
:
string
,
targetId
:
string
)
{
return
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
masterId
===
masterId
&&
targetId
===
item
.
targetId
return
item
.
masterId
===
masterId
&&
targetId
===
item
.
targetId
;
})
.
delete
()
.
delete
()
;
}
updateCard
(
...
...
@@ -39,20 +39,22 @@ export default class ChatListCardDB extends MyAppDatabase {
)
{
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
masterId
===
masterId
&&
targetId
===
item
.
targetId
return
item
.
masterId
===
masterId
&&
targetId
===
item
.
targetId
;
})
.
modify
((
item
)
=>
{
item
.
unreadMsgCount
=
count
item
.
content
=
content
item
.
datetime
=
datetime
})
item
.
unreadMsgCount
=
count
;
item
.
content
=
content
;
item
.
datetime
=
datetime
;
})
;
}
getCardList
(
masterId
:
string
)
{
return
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
masterId
===
masterId
}).
reverse
().
sortBy
(
'datetime'
)
return
item
.
masterId
===
masterId
;
})
.
reverse
()
.
sortBy
(
"datetime"
);
}
async
thePersonAlreadyInChatList
(
masterId
:
string
,
personId
:
string
)
{
...
...
@@ -60,38 +62,37 @@ export default class ChatListCardDB extends MyAppDatabase {
(
await
this
.
chatListCard
.
filter
((
i
)
=>
i
.
targetId
===
personId
&&
i
.
masterId
===
masterId
)
.
count
())
!==
0
)
)
;
}
async
updateNewestCard
(
data
:
{
msg
:
DisplayMessage
isChattingWithTargetId
:
boolean
msg
:
DisplayMessage
;
isChattingWithTargetId
:
boolean
;
})
{
const
{
msg
,
isChattingWithTargetId
}
=
data
const
targetId
=
getTargetIdFromDisplayMsg
(
msg
)
const
masterId
=
getMasterIdFromDisplayMsg
(
msg
)
const
{
msg
,
isChattingWithTargetId
}
=
data
;
const
targetId
=
getTargetIdFromDisplayMsg
(
msg
)
;
const
masterId
=
getMasterIdFromDisplayMsg
(
msg
)
;
const
cardItem
=
await
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
masterId
===
masterId
&&
item
.
targetId
===
targetId
return
item
.
masterId
===
masterId
&&
item
.
targetId
===
targetId
;
})
.
first
()
.
first
()
;
let
content
:
string
let
content
:
string
;
if
(
msg
.
type
===
ChatMessageTypes
.
Card
)
{
content
=
ChatDataService
.
getInstance
().
extractCommonMsgContentFromMsg
(
msg
,
getUserMsg
()?.
role
as
eRole
,
)
||
''
getUserMsg
()?.
role
2
as
eRole
)
||
""
;
}
else
{
content
=
msg
.
content
?.
content
||
'[新消息]'
content
=
msg
.
content
?.
content
||
"[新消息]"
;
}
const
unreadMsgCount
=
cardItem
?.
unreadMsgCount
||
0
const
unreadMsgCount
=
cardItem
?.
unreadMsgCount
||
0
;
console
.
log
(
data
.
msg
,
'show msg when update newest card'
);
console
.
log
(
data
.
msg
,
"show msg when update newest card"
);
this
.
updateCard
(
masterId
,
...
...
@@ -99,18 +100,18 @@ export default class ChatListCardDB extends MyAppDatabase {
isChattingWithTargetId
?
0
:
unreadMsgCount
+
1
,
content
,
data
.
msg
.
datetime
)
)
;
}
async
addNewCard
(
data
:
{
msg
:
DisplayMessage
isChattingWithTargetId
:
boolean
,
isRobootCard
?:
boolean
msg
:
DisplayMessage
;
isChattingWithTargetId
:
boolean
;
isRobootCard
?:
boolean
;
})
{
const
content
=
data
.
msg
.
content
?.
content
||
'[新消息]'
const
masterId
=
getMasterIdFromDisplayMsg
(
data
.
msg
)
const
targetId
=
getTargetIdFromDisplayMsg
(
data
.
msg
)
console
.
log
(
data
.
msg
,
'in addNewCard'
)
const
content
=
data
.
msg
.
content
?.
content
||
"[新消息]"
;
const
masterId
=
getMasterIdFromDisplayMsg
(
data
.
msg
)
;
const
targetId
=
getTargetIdFromDisplayMsg
(
data
.
msg
)
;
console
.
log
(
data
.
msg
,
"in addNewCard"
);
this
.
saveCard
({
masterId
,
...
...
@@ -120,36 +121,36 @@ export default class ChatListCardDB extends MyAppDatabase {
inChat
:
false
,
datetime
:
data
.
msg
.
datetime
,
isRobootCard
:
data
.
isRobootCard
,
})
})
;
}
readMsg
(
masterId
:
string
,
targetId
:
string
)
{
return
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
;
})
.
modify
((
item
)
=>
{
item
.
unreadMsgCount
=
0
})
item
.
unreadMsgCount
=
0
;
})
;
}
setChatStatus
(
masterId
:
string
,
targetId
:
string
,
isChat
:
boolean
)
{
return
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
;
})
.
modify
((
item
)
=>
{
item
.
inChat
=
isChat
})
item
.
inChat
=
isChat
;
})
;
}
async
getChatStatus
(
masterId
:
string
,
targetId
:
string
)
{
const
ret
=
await
this
.
chatListCard
.
filter
((
item
)
=>
{
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
return
item
.
targetId
===
targetId
&&
item
.
masterId
===
masterId
;
})
.
first
()
.
first
()
;
return
ret
?.
inChat
return
ret
?.
inChat
;
}
}
src/router/index.ts
View file @
7305f4b7
...
...
@@ -257,8 +257,11 @@ router.beforeEach((to, from, next) => {
const
userMsg
=
getUserMsg
();
if
(
to
.
meta
.
needAuth
)
{
if
(
!!
userMsg
)
{
if
(
userMsg
.
role
===
eRole
.
user
)
next
();
else
if
(
userMsg
.
role
===
eRole
.
staff
)
{
if
(
userMsg
.
role2
===
eRole
.
user
)
next
();
else
if
(
userMsg
.
role2
===
eRole
.
staff
||
userMsg
.
role2
===
eRole
.
manager
)
{
if
(
to
.
name
===
"ChatList"
)
{
chatAuthCheck
(
()
=>
{
...
...
src/utils/authCheck.ts
View file @
7305f4b7
import
router
from
'@/router'
import
{
getStaffOnDutyStatus
}
from
'@/service/StaffService'
import
{
eRole
}
from
'@/types/roleType'
import
{
getUserMsg
}
from
'./userMsg'
import
router
from
"@/router"
;
import
{
getStaffOnDutyStatus
}
from
"@/service/StaffService"
;
import
{
eRole
}
from
"@/types/roleType"
;
import
{
getUserMsg
}
from
"./userMsg"
;
export
function
authCheck
(
cb
:
Function
)
{
if
(
getUserMsg
())
cb
()
if
(
getUserMsg
())
cb
()
;
else
{
router
.
push
({
name
:
'Login'
,
})
name
:
"Login"
,
})
;
}
}
...
...
@@ -18,17 +18,15 @@ export function authCheck(cb: Function) {
* @param cb2 没有权限时回调 什么时候没有权限?本地无token,用户在其他地方登录,不在岗或被禁用了
*/
export
async
function
chatAuthCheck
(
cb
:
Function
,
cb2
?:
Function
)
{
const
msg
=
getUserMsg
()
if
(
msg
?.
role
===
eRole
.
user
)
{
cb
()
}
else
if
(
msg
?.
role
===
eRole
.
staff
)
{
const
ret
=
await
getStaffOnDutyStatus
()
const
msg
=
getUserMsg
()
;
if
(
msg
?.
role
2
===
eRole
.
user
)
{
cb
()
;
}
else
{
const
ret
=
await
getStaffOnDutyStatus
()
;
if
(
ret
.
code
===
200
&&
ret
.
data
)
{
cb
()
cb
()
;
}
else
{
cb2
&&
cb2
(
ret
.
data
)
cb2
&&
cb2
(
ret
.
data
)
;
}
}
else
{
cb2
&&
cb2
()
}
}
src/utils/displayName.ts
View file @
7305f4b7
...
...
@@ -16,13 +16,13 @@ export const getDisplayNamesFromAddress = async (
let
foundList
=
[]
as
any
[];
let
notFoundList
=
[]
as
any
[];
if
(
user
?.
role
===
eRole
.
user
)
{
if
(
user
?.
role
2
===
eRole
.
user
)
{
const
ret
=
await
ContactPersonService
.
getInstance
().
findByList
(
addressList
);
foundList
=
ret
.
foundList
;
notFoundList
=
ret
.
notFoundList
;
}
else
if
(
user
?.
role
===
eRole
.
staff
)
{
}
else
if
(
user
?.
role
2
===
eRole
.
staff
||
user
?.
role2
===
eRole
.
manager
)
{
const
ret
=
await
UserInfoDBService
.
getInstance
().
findByList
(
addressList
);
foundList
=
ret
.
foundList
;
notFoundList
=
ret
.
notFoundList
;
...
...
@@ -31,7 +31,7 @@ export const getDisplayNamesFromAddress = async (
const
fullList
=
foundList
as
unknown
as
any
;
if
(
notFoundList
.
length
!==
0
)
{
if
(
user
?.
role
===
eRole
.
user
)
{
if
(
user
?.
role
2
===
eRole
.
user
)
{
const
ret
=
await
UserService
.
getInstance
().
staffInfo
({
addrs
:
notFoundList
,
});
...
...
@@ -40,7 +40,7 @@ export const getDisplayNamesFromAddress = async (
ContactPersonService
.
getInstance
().
save
(
theoseNotFoundList
);
fullList
.
push
(...
theoseNotFoundList
);
}
}
else
if
(
user
?.
role
===
eRole
.
staff
)
{
}
else
if
(
user
?.
role
2
===
eRole
.
staff
||
user
?.
role2
===
eRole
.
manager
)
{
const
ret
=
await
UserService
.
getInstance
().
userInfo
({
addrs
:
notFoundList
,
});
...
...
@@ -126,13 +126,13 @@ export const getMsgFromAddress = async (
let
foundList
=
[]
as
any
[];
let
notFoundList
=
[]
as
any
[];
if
(
user
?.
role
===
eRole
.
user
)
{
if
(
user
?.
role
2
===
eRole
.
user
)
{
const
ret
=
await
ContactPersonService
.
getInstance
().
findByList
(
addressList
);
foundList
=
ret
.
foundList
;
notFoundList
=
ret
.
notFoundList
;
}
else
if
(
user
?.
role
===
eRole
.
staff
)
{
}
else
if
(
user
?.
role
2
===
eRole
.
staff
||
user
?.
role2
===
eRole
.
manager
)
{
const
ret
=
await
UserInfoDBService
.
getInstance
().
findByList
(
addressList
);
foundList
=
ret
.
foundList
;
notFoundList
=
ret
.
notFoundList
;
...
...
@@ -141,7 +141,7 @@ export const getMsgFromAddress = async (
const
fullList
=
foundList
as
unknown
as
any
;
if
(
notFoundList
.
length
!==
0
)
{
if
(
user
?.
role
===
eRole
.
user
)
{
if
(
user
?.
role
2
===
eRole
.
user
)
{
const
ret
=
await
UserService
.
getInstance
().
staffInfo
({
addrs
:
notFoundList
,
});
...
...
@@ -150,7 +150,7 @@ export const getMsgFromAddress = async (
ContactPersonService
.
getInstance
().
save
(
theoseNotFoundList
);
fullList
.
push
(...
theoseNotFoundList
);
}
}
else
if
(
user
?.
role
===
eRole
.
staff
)
{
}
else
if
(
user
?.
role
2
===
eRole
.
staff
||
user
?.
role2
===
eRole
.
manager
)
{
const
ret
=
await
UserService
.
getInstance
().
userInfo
({
addrs
:
notFoundList
,
});
...
...
src/utils/live.ts
View file @
7305f4b7
import
Bridge
from
'@/utils/jsBridge2'
import
{
Toast
}
from
'vant'
import
{
enableLive
}
from
'@/service/StaffService/index'
import
{
getCurrentUserAvatarUrl
,
getUserMsg
}
from
'./userMsg'
import
{
eRole
}
from
'@/types/roleType'
import
Bridge
from
"@/utils/jsBridge2"
;
import
{
Toast
}
from
"vant"
;
import
{
enableLive
}
from
"@/service/StaffService/index"
;
import
{
getCurrentUserAvatarUrl
,
getUserMsg
}
from
"./userMsg"
;
import
{
eRole
}
from
"@/types/roleType"
;
export
const
sendLive
=
()
=>
{
const
avatarUrl
=
getCurrentUserAvatarUrl
()
const
avatarUrl
=
getCurrentUserAvatarUrl
()
;
const
finalAvatarUrl
=
window
.
location
.
protocol
+
'//'
+
window
.
location
.
host
+
avatarUrl
window
.
location
.
protocol
+
"//"
+
window
.
location
.
host
+
avatarUrl
;
const
USER_MSG
=
window
.
localStorage
.
getItem
(
'USER_MSG'
)
let
allow
=
false
let
time_section
=
''
const
USER_MSG
=
window
.
localStorage
.
getItem
(
"USER_MSG"
);
let
allow
=
false
;
let
time_section
=
""
;
if
(
!
USER_MSG
)
{
Toast
(
'请先登录'
)
return
}
else
if
(
getUserMsg
()?.
role
===
eRole
.
user
)
{
Toast
(
"请先登录"
);
return
;
}
else
if
(
getUserMsg
()?.
role
2
===
eRole
.
user
)
{
new
Bridge
().
bridge_live
({
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'USER_MSG'
)
as
string
)
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
"USER_MSG"
)
as
string
)
?.
userInfo
.
phone
,
avatar
:
finalAvatarUrl
,
allow
,
time_section
,
})
return
})
;
return
;
}
enableLive
()
.
then
((
res
)
=>
{
if
(
res
.
code
===
200
)
{
allow
=
res
.
data
.
allow
time_section
=
res
.
data
.
time_section
allow
=
res
.
data
.
allow
;
time_section
=
res
.
data
.
time_section
;
}
new
Bridge
().
bridge_live
({
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'USER_MSG'
)
as
string
)
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
"USER_MSG"
)
as
string
)
?.
userInfo
.
phone
,
avatar
:
finalAvatarUrl
,
allow
,
time_section
,
})
})
;
})
.
catch
(()
=>
{
new
Bridge
().
bridge_live
({
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
'USER_MSG'
)
as
string
)
phone
:
JSON
.
parse
(
window
.
localStorage
.
getItem
(
"USER_MSG"
)
as
string
)
?.
userInfo
.
phone
,
avatar
:
finalAvatarUrl
,
allow
,
time_section
,
})
})
}
})
;
})
;
}
;
src/utils/userMsg.ts
View file @
7305f4b7
...
...
@@ -31,9 +31,12 @@ export function deleteUserMsg() {
}
export
function
getCurrentUserAvatarUrl
()
{
if
(
getUserMsg
()?.
role
===
eRole
.
staff
)
{
if
(
getUserMsg
()?.
role2
===
eRole
.
staff
||
getUserMsg
()?.
role2
===
eRole
.
manager
)
{
return
staffAvatarUrl
;
}
else
if
(
getUserMsg
()?.
role
===
eRole
.
user
)
{
}
else
if
(
getUserMsg
()?.
role
2
===
eRole
.
user
)
{
return
userAvatarUrl
;
}
else
{
return
userAvatarUrl
;
...
...
src/views/Chat/Chat.vue
View file @
7305f4b7
...
...
@@ -369,7 +369,7 @@ export default defineComponent({
const
callPhone
=
ref
(
""
);
const
isUser
=
computed
(()
=>
{
return
getUserMsg
()?.
role
===
eRole
.
user
;
return
getUserMsg
()?.
role
2
===
eRole
.
user
;
});
return
{
...
...
src/views/Chat/ChatContentMessage.vue
View file @
7305f4b7
<
template
>
<div>
<div
v-if=
"!hideDatetime"
class=
"text-xs text-gray-400 text-center pb-2 pt-4"
>
{{
time
}}
</div>
<div
v-if=
"!hideDatetime"
class=
"text-xs text-gray-400 text-center pb-2 pt-4"
>
{{
time
}}
</div>
<!-- 卡片消息 -->
<ChatContentMessageCardVue
v-if=
"type === 6"
:from-myself=
"fromMyself"
:content=
"content"
></ChatContentMessageCardVue>
<ChatContentMessageCardVue
v-if=
"type === 6"
:from-myself=
"fromMyself"
:content=
"content"
></ChatContentMessageCardVue>
<div
class=
"flex items-start flex-nowrap w-screen py-1.5"
:class=
"
{ 'flex-row-reverse': fromMyself }"
>
<!-- 头像 -->
<q-avatar
class=
"mx-4 min-w-chat-msg-avatar !rounded-md !w-10 !h-10"
v-if=
"type !== 6"
>
<img
v-if=
"fromMyself && userType === eRole.user"
:src=
"userAvatarUrl"
/>
<q-avatar
class=
"mx-4 min-w-chat-msg-avatar !rounded-md !w-10 !h-10"
v-if=
"type !== 6"
>
<img
v-if=
"fromMyself && userType === eRole.user"
:src=
"userAvatarUrl"
/>
<img
v-if=
"fromMyself && userType
=== eRole.staff
"
v-if=
"fromMyself && userType
!== eRole.user
"
:src=
"staffAvatarUrl"
class=
"object-contain"
/>
...
...
@@ -26,7 +41,10 @@
class=
"object-contain"
:class=
"
{ filterGray: isRobootOffLine }"
/>
<img
v-else-if=
"!fromMyself && userType === eRole.staff"
:src=
"userAvatarUrl"
/>
<img
v-else-if=
"!fromMyself && userType !== eRole.user"
:src=
"userAvatarUrl"
/>
</q-avatar>
<!-- 消息气泡 -->
...
...
@@ -49,7 +67,10 @@
>
<template
#
reference
>
<!-- 文本消息 -->
<ChatContentMessageTextVue
:from-myself=
"fromMyself"
:content=
"content"
/>
<ChatContentMessageTextVue
:from-myself=
"fromMyself"
:content=
"content"
/>
</
template
>
</van-popover>
</div>
...
...
@@ -73,7 +94,9 @@
/>-->
<!-- 消息状态 -->
<div
class=
"w-10 self-stretch flex flex-row justify-center items-center"
>
<div
class=
"w-10 self-stretch flex flex-row justify-center items-center"
>
<!-- 发送失败 -->
<div
v-if=
"state === 'failure'"
...
...
@@ -109,13 +132,13 @@ import default_avatar_url from "@/assets/user_avatar.png";
import
{
messageStore
}
from
"@/store/messagesStore"
;
import
ChatContentMessageTextVue
from
"./ChatContentMessageText.vue"
;
import
ChatContentMessageCardVue
from
"./ChatContentMessageCard.vue"
;
import
userAvatarUrl
from
"@/assets/icons/avatar.png"
import
userAvatarUrl
from
"@/assets/icons/avatar.png"
;
import
staffAvatarUrl
from
"@/assets/icons/staff.png"
;
// import ChatContentMessageImageVue from "./ChatContentMessageImage.vue";
import
{
ChatMessageTypes
}
from
"@/types/chatMessageTypes"
;
// import ChatContentMessageVideoVue from "./ChatContentMessageVideo.vue";
import
{
target
}
from
"@/store/appCallerStore"
;
import
{
copyToClipboard
}
from
'quasar'
import
{
copyToClipboard
}
from
"quasar"
;
import
{
Toast
}
from
"vant"
;
import
ChatMessageDB
from
"@/db/ChatMessageDB"
;
import
{
useRoute
}
from
"vue-router"
;
...
...
@@ -123,7 +146,6 @@ import { clipboardValue } from "@/store/AppStore";
import
{
getUserMsg
}
from
"@/utils/userMsg"
;
import
{
eRole
}
from
"@/types/roleType"
;
export
default
defineComponent
({
components
:
{
ChatContentMessageTextVue
,
...
...
@@ -141,19 +163,23 @@ export default defineComponent({
uuid
:
{
type
:
String
,
required
:
true
},
hideDatetime
:
Boolean
,
uploadProgress
:
Object
,
logid
:
{
type
:
String
,
required
:
false
,
},
isRobootOffLine
:
{
type
:
Boolean
,
required
:
false
}
logid
:
{
type
:
String
,
required
:
false
},
isRobootOffLine
:
{
type
:
Boolean
,
required
:
false
}
,
},
setup
(
props
)
{
const
route
=
useRoute
()
const
route
=
useRoute
();
/** 重发消息 */
const
resend
=
()
=>
{
messageStore
.
sendMessage
({
type
:
props
.
type
,
content
:
props
.
content
,
uuid
:
props
.
uuid
,
target
:
route
.
query
.
targetId
as
string
});
messageStore
.
sendMessage
({
type
:
props
.
type
,
content
:
props
.
content
,
uuid
:
props
.
uuid
,
target
:
route
.
query
.
targetId
as
string
,
});
};
const
userType
=
getUserMsg
()?.
role
const
userType
=
getUserMsg
()?.
role
2
;
const
abort
=
()
=>
{
messageStore
.
abortSendingMessage
(
...
...
@@ -169,45 +195,54 @@ export default defineComponent({
);
});
const
textMsgActions
=
[
{
text
:
'删除'
,
cb
(
data
:
{
content
:
any
,
uuid
:
string
,
logid
?:
string
,
})
{
ChatMessageDB
.
getInstance
().
deleteMsg
({
uuid
:
data
.
uuid
,
logid
:
data
.
logid
});
const
index
=
messageStore
.
messages
.
findIndex
(
i
=>
{
return
i
.
uuid
===
data
.
uuid
})
text
:
"删除"
,
cb
(
data
:
{
content
:
any
;
uuid
:
string
;
logid
?:
string
})
{
ChatMessageDB
.
getInstance
().
deleteMsg
({
uuid
:
data
.
uuid
,
logid
:
data
.
logid
,
});
const
index
=
messageStore
.
messages
.
findIndex
((
i
)
=>
{
return
i
.
uuid
===
data
.
uuid
;
});
messageStore
.
appendingNewMessage
.
value
=
false
;
messageStore
.
messages
.
splice
(
index
,
1
);
}
}
,
},
{
text
:
'复制'
,
cb
(
data
:
{
content
:
any
,
uuid
:
string
,
logid
:
string
})
{
text
:
"复制"
,
cb
(
data
:
{
content
:
any
;
uuid
:
string
;
logid
:
string
})
{
clipboardValue
.
value
=
data
.
content
.
content
;
}
}
]
}
,
}
,
]
;
const
onTextMsgSelect
=
(
action
:
typeof
textMsgActions
[
0
])
=>
{
action
.
cb
({
content
:
props
.
content
,
uuid
:
props
.
uuid
,
logid
:
props
.
logid
})
logid
:
props
.
logid
,
})
;
};
const
showPopOver
=
ref
(
false
);
const
handleTouchHoldItem
=
()
=>
{
showPopOver
.
value
=
true
;
}
}
;
const
clickItem
=
()
=>
{
showPopOver
.
value
=
false
;
}
}
;
const
isRoboot
=
computed
(()
=>
{
return
route
.
query
.
outlet
})
return
route
.
query
.
outlet
;
})
;
return
{
default_avatar_url
,
resend
,
isMedia
,
abort
,
ChatMessageTypes
,
handleTouchHoldItem
,
default_avatar_url
,
resend
,
isMedia
,
abort
,
ChatMessageTypes
,
handleTouchHoldItem
,
onTextMsgSelect
,
textMsgActions
,
showPopOver
,
...
...
@@ -216,11 +251,10 @@ export default defineComponent({
userType
,
userAvatarUrl
,
staffAvatarUrl
,
isRoboot
isRoboot
,
};
},
});
</
script
>
<
style
scoped
>
.message_
{
...
...
@@ -229,4 +263,4 @@ export default defineComponent({
color
:
#adadad
;
font-weight
:
400
;
}
</
style
>
\ No newline at end of file
</
style
>
src/views/Chat/ChatContentMessageCard.vue
View file @
7305f4b7
<
template
>
<div
class=
"w-full rounded-md font-medium flex items-center"
>
<div
class=
"flex-grow border-b mr-1 ml-2"
></div>
<div
class=
"text-center"
v-if=
"isUser"
>
{{
sentence
?.
user
.
value
}}
</div>
<div
class=
"text-center"
v-else
>
{{
sentence
?.
staff
.
value
}}
</div>
<div
class=
"flex-grow border-b ml-1 mr-2"
></div>
</div>
<div
class=
"w-full rounded-md font-medium flex items-center"
>
<div
class=
"flex-grow border-b mr-1 ml-2"
></div>
<div
class=
"text-center"
v-if=
"isUser"
>
{{
sentence
?.
user
.
value
}}
</div>
<div
class=
"text-center"
v-else
>
{{
sentence
?.
staff
.
value
}}
</div>
<div
class=
"flex-grow border-b ml-1 mr-2"
></div>
</div>
</
template
>
<
script
lang=
"ts"
>
import
{
defineComponent
,
PropType
}
from
'vue'
import
iconUrl
from
'@/assets/message_bank_card.png'
import
{
getUserMsg
}
from
'@/utils/userMsg'
import
{
eRole
}
from
'@/types/roleType'
import
{
CHAT_CONST_LIST
}
from
'@/config/chat'
import
{
defineComponent
,
PropType
}
from
"vue"
;
import
iconUrl
from
"@/assets/message_bank_card.png"
;
import
{
getUserMsg
}
from
"@/utils/userMsg"
;
import
{
eRole
}
from
"@/types/roleType"
;
import
{
CHAT_CONST_LIST
}
from
"@/config/chat"
;
export
default
defineComponent
({
props
:
{
fromMyself
:
Boolean
,
content
:
{
required
:
true
,
type
:
Object
as
PropType
<
{
bank
:
string
,
name
:
string
,
account
:
string
}
>
,
}
},
setup
(
props
)
{
const
isUser
=
getUserMsg
()?.
role
===
eRole
.
user
const
sentence
=
CHAT_CONST_LIST
.
find
(
i
=>
i
.
user
.
id
===
props
?.
content
.
bank
)
return
{
iconUrl
,
isUser
,
sentence
,
CHAT_CONST_LIST
}
props
:
{
fromMyself
:
Boolean
,
content
:
{
required
:
true
,
type
:
Object
as
PropType
<
{
bank
:
string
;
name
:
string
;
account
:
string
}
>
,
},
})
},
setup
(
props
)
{
const
isUser
=
getUserMsg
()?.
role2
===
eRole
.
user
;
const
sentence
=
CHAT_CONST_LIST
.
find
(
(
i
)
=>
i
.
user
.
id
===
props
?.
content
.
bank
);
return
{
iconUrl
,
isUser
,
sentence
,
CHAT_CONST_LIST
};
},
});
</
script
>
src/views/Chat/ChatInput.vue
View file @
7305f4b7
...
...
@@ -138,8 +138,7 @@ export default defineComponent({
const
handleSend
=
()
=>
{
console
.
log
(
"handle send"
);
const
isStaff
=
getUserMsg
()?.
role
===
eRole
.
staff
;
const
isUser
=
getUserMsg
()?.
role
===
eRole
.
user
;
const
isUser
=
getUserMsg
()?.
role2
===
eRole
.
user
;
if
(
isUser
&&
route
.
query
.
outlet
!==
undefined
)
{
/* 当前角色是客户,
...
...
src/views/withMenu/ChatList/index.vue
View file @
7305f4b7
...
...
@@ -56,9 +56,7 @@
<div
v-if=
"userType === eRole.user"
class=
"tip"
>
咨询客户经理后,可以在这里快捷查看消息哦!
</div>
<div
v-else-if=
"userType === eRole.staff"
class=
"tip"
>
客户咨询后,可以在这里快捷查看消息哦!
</div>
<div
v-else
class=
"tip"
>
客户咨询后,可以在这里快捷查看消息哦!
</div>
</div>
</template>
<
script
lang=
"ts"
setup
>
...
...
@@ -123,15 +121,15 @@ watch(chatCardTimeStamp, async () => {
});
const
navBarTitle
=
computed
(()
=>
{
if
(
getUserMsg
()?.
role
===
eRole
.
user
)
{
if
(
getUserMsg
()?.
role
2
===
eRole
.
user
)
{
return
"我的客户经理"
;
}
else
if
(
getUserMsg
()?.
role
===
eRole
.
staff
)
{
}
else
{
return
"我的客户"
;
}
});
const
userType
=
computed
(()
=>
{
return
getUserMsg
()?.
role
;
return
getUserMsg
()?.
role
2
;
});
const
actions
=
[
...
...
src/views/withMenu/Mine/index.vue
View file @
7305f4b7
...
...
@@ -115,15 +115,12 @@ export default defineComponent({
return
getUserMsg
();
});
const
isUser
=
computed
(()
=>
{
console
.
log
(
"isuser"
,
userMsg
?.
value
?.
role
==
eRole
.
user
);
return
userMsg
?.
value
?.
role
==
eRole
.
user
;
return
userMsg
?.
value
?.
role2
==
eRole
.
user
;
});
let
branchinfo
=
reactive
({}
as
iNearbyOutLet
);
onMounted
(
async
()
=>
{
state
.
loading
=
true
;
// const isUser = userMsg?.value?.role2 == eRole.user
if
(
isUser
)
{
const
ret
=
await
AddressService
.
getInstance
().
getNearby
({
bank_code
:
Number
(
process
.
env
.
VUE_APP_BANK_CODE
),
...
...
src/views/withMenu/tabList.ts
View file @
7305f4b7
import
{
eRole
}
from
'@/types/roleType'
import
{
eRole
}
from
"@/types/roleType"
;
export
default
[
{
name
:
'首页'
,
routeName
:
'Home'
,
icon
:
'icon-shouye-tab-xuanze1'
,
icon1
:
'icon-shouye-tab'
,
name
:
"首页"
,
routeName
:
"Home"
,
icon
:
"icon-shouye-tab-xuanze1"
,
icon1
:
"icon-shouye-tab"
,
roles
:
[
eRole
.
user
,
eRole
.
staff
,
eRole
.
manager
],
showNotLogin
:
true
,
},
{
name
:
'聊天'
,
routeName
:
'ChatList'
,
icon1
:
'icon-liaotian'
,
icon
:
'icon-liaotian-dianji'
,
roles
:
[
eRole
.
staff
,
eRole
.
user
],
name
:
"聊天"
,
routeName
:
"ChatList"
,
icon1
:
"icon-liaotian"
,
icon
:
"icon-liaotian-dianji"
,
roles
:
[
eRole
.
staff
,
eRole
.
user
,
eRole
.
manager
],
showNotLogin
:
true
,
},
{
name
:
'产品'
,
routeName
:
'Loan'
,
icon
:
'icon-daikuan-tab-xuanze'
,
icon1
:
'icon-daikuan-tab'
,
name
:
"产品"
,
routeName
:
"Loan"
,
icon
:
"icon-daikuan-tab-xuanze"
,
icon1
:
"icon-daikuan-tab"
,
roles
:
[
eRole
.
user
,
eRole
.
staff
,
eRole
.
manager
],
showNotLogin
:
true
,
hideInReviewMode
:
true
,
},
{
name
:
'我的'
,
routeName
:
'Mine'
,
icon
:
'icon-wode-tabdianji'
,
icon1
:
'icon-wode-tab'
,
roles
:
[
eRole
.
user
,
eRole
.
staff
,
eRole
.
manager
],
name
:
"我的"
,
routeName
:
"Mine"
,
icon
:
"icon-wode-tabdianji"
,
icon1
:
"icon-wode-tab"
,
roles
:
[
eRole
.
user
,
eRole
.
staff
,
eRole
.
manager
],
showNotLogin
:
true
,
},
]
]
;
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