|
@@ -8,13 +8,13 @@
|
|
|
<!-- <div class="avatar">{{ msg.receiverName.charAt(0) }}</div> -->
|
|
<!-- <div class="avatar">{{ msg.receiverName.charAt(0) }}</div> -->
|
|
|
<el-avatar class="avatar" :size="40" :src="msg.receiverIcon || 'https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png'" />
|
|
<el-avatar class="avatar" :size="40" :src="msg.receiverIcon || 'https://birdseye-img.sysuimars.com/birdseye-look-mini/Group%201321316260.png'" />
|
|
|
<img src="" alt="">
|
|
<img src="" alt="">
|
|
|
- <div class="bubble">
|
|
|
|
|
|
|
+ <div class="bubble" :class="{ 'no-bubble': msg.messageType === 'image' }">
|
|
|
<!-- 文本消息 -->
|
|
<!-- 文本消息 -->
|
|
|
<div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
|
|
<div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
|
|
|
|
|
|
|
|
<!-- 图片消息 -->
|
|
<!-- 图片消息 -->
|
|
|
<div v-if="msg.messageType === 'image'" class="image-message">
|
|
<div v-if="msg.messageType === 'image'" class="image-message">
|
|
|
- <img :src="msg.content + resize" @click="showImagePreview(msg.content)" :onload="handleImageLoad()" alt="图片" />
|
|
|
|
|
|
|
+ <img :src="msg.content + resize" @click="showImagePreview(msg.content)" @load="handleImageLoad" alt="图片" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 语音消息 -->
|
|
<!-- 语音消息 -->
|
|
@@ -68,13 +68,13 @@
|
|
|
|
|
|
|
|
<!-- 我方消息 -->
|
|
<!-- 我方消息 -->
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
- <div class="bubble">
|
|
|
|
|
|
|
+ <div class="bubble" :class="{ 'no-bubble': msg.messageType === 'image' }">
|
|
|
<!-- 文本消息 -->
|
|
<!-- 文本消息 -->
|
|
|
<div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
|
|
<div v-if="msg.messageType === 'text'" class="content">{{ msg.content }}</div>
|
|
|
|
|
|
|
|
<!-- 图片消息 -->
|
|
<!-- 图片消息 -->
|
|
|
<div v-if="msg.messageType === 'image'" class="image-message">
|
|
<div v-if="msg.messageType === 'image'" class="image-message">
|
|
|
- <img :src="msg.content + resize" @click="showImagePreview(msg.content)" :onload="handleImageLoad()" alt="图片" />
|
|
|
|
|
|
|
+ <img :src="msg.content + resize" @click="showImagePreview(msg.content)" @load="handleImageLoad" alt="图片" />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 语音消息 -->
|
|
<!-- 语音消息 -->
|
|
@@ -205,6 +205,19 @@ const senderIcon = ref('')
|
|
|
const receiverIcon = ref('')
|
|
const receiverIcon = ref('')
|
|
|
const receiverIdVal = ref(null)
|
|
const receiverIdVal = ref(null)
|
|
|
|
|
|
|
|
|
|
+// 本地用户头像
|
|
|
|
|
+const localUserInfoIcon = (() => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const info = JSON.parse(localStorage.getItem('localUserInfo') || '{}')
|
|
|
|
|
+ return info?.icon || ''
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ return ''
|
|
|
|
|
+ }
|
|
|
|
|
+})()
|
|
|
|
|
+
|
|
|
|
|
+// 初始化本地头像为默认发送者头像
|
|
|
|
|
+senderIcon.value = localUserInfoIcon
|
|
|
|
|
+
|
|
|
//聊天会话
|
|
//聊天会话
|
|
|
const createSession = (targetUserId,callback) =>{
|
|
const createSession = (targetUserId,callback) =>{
|
|
|
// 先保存当前的对话样式消息 要注释
|
|
// 先保存当前的对话样式消息 要注释
|
|
@@ -212,19 +225,29 @@ const createSession = (targetUserId,callback) =>{
|
|
|
|
|
|
|
|
VE_API.bbs.createSession({farmId:766,targetUserId}).then(({data,code}) => {
|
|
VE_API.bbs.createSession({farmId:766,targetUserId}).then(({data,code}) => {
|
|
|
if(code === 0){
|
|
if(code === 0){
|
|
|
- senderIcon.value = data.session.aaa
|
|
|
|
|
|
|
+ senderIcon.value = localUserInfoIcon
|
|
|
receiverIcon.value = data.session.targetUserAvatar
|
|
receiverIcon.value = data.session.targetUserAvatar
|
|
|
receiverIdVal.value = data.session.targetUserId
|
|
receiverIdVal.value = data.session.targetUserId
|
|
|
messages.value = data.messages.map(item =>{
|
|
messages.value = data.messages.map(item =>{
|
|
|
let content = item.content
|
|
let content = item.content
|
|
|
if(item.messageType==='image'){
|
|
if(item.messageType==='image'){
|
|
|
- content = JSON.parse(item.content).originUrl
|
|
|
|
|
|
|
+ // 优先读取后端的 image 字段,其次兼容旧的 content(JSON)
|
|
|
|
|
+ if (item.image && (item.image.url || item.image.originUrl)) {
|
|
|
|
|
+ content = item.image.url || item.image.originUrl
|
|
|
|
|
+ } else if (item.content) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const imgObj = JSON.parse(item.content)
|
|
|
|
|
+ content = imgObj.url || imgObj.originUrl
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error(e,'e')
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return {
|
|
return {
|
|
|
...item,
|
|
...item,
|
|
|
content,
|
|
content,
|
|
|
sender:item.senderId===curUserId?'sent':'received',
|
|
sender:item.senderId===curUserId?'sent':'received',
|
|
|
- senderIcon:data.session.aaa,
|
|
|
|
|
|
|
+ senderIcon:item.senderId===curUserId ? localUserInfoIcon : data.session.targetUserAvatar,
|
|
|
receiverIcon:data.session.targetUserAvatar
|
|
receiverIcon:data.session.targetUserAvatar
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
@@ -274,9 +297,7 @@ watch(()=>props.userId,(newValue) =>{
|
|
|
const imgArr = JSON.parse(props.img)
|
|
const imgArr = JSON.parse(props.img)
|
|
|
if(imgArr.length){
|
|
if(imgArr.length){
|
|
|
imgArr.forEach(item =>{
|
|
imgArr.forEach(item =>{
|
|
|
- sendMsg('image','',{
|
|
|
|
|
- originUrl:item
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ sendMsg('image', '', { url: item, thumbnailUrl: item + resize })
|
|
|
messages.value.push({
|
|
messages.value.push({
|
|
|
sender: "sent",
|
|
sender: "sent",
|
|
|
senderIcon: senderIcon.value,
|
|
senderIcon: senderIcon.value,
|
|
@@ -334,8 +355,16 @@ const initMqtt = () => {
|
|
|
console.log('message有值',obj)
|
|
console.log('message有值',obj)
|
|
|
if(obj.senderId === receiverIdVal.value){
|
|
if(obj.senderId === receiverIdVal.value){
|
|
|
if(obj.messageType==="image"){
|
|
if(obj.messageType==="image"){
|
|
|
- const img = JSON.parse(obj.content)
|
|
|
|
|
- obj.content = img.originUrl
|
|
|
|
|
|
|
+ if (obj.image && (obj.image.url || obj.image.originUrl)) {
|
|
|
|
|
+ obj.content = obj.image.url || obj.image.originUrl
|
|
|
|
|
+ } else if (obj.content) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const img = JSON.parse(obj.content)
|
|
|
|
|
+ obj.content = img.url || img.originUrl
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error(e,'e')
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
obj.receiverId = curUserId
|
|
obj.receiverId = curUserId
|
|
|
obj.sender = obj.senderId === curUserId ?'sent':'received',
|
|
obj.sender = obj.senderId === curUserId ?'sent':'received',
|
|
@@ -356,10 +385,8 @@ const sendMessage = (message) => {
|
|
|
if(message.messageType === 'text'){
|
|
if(message.messageType === 'text'){
|
|
|
sendMsg('text',message.content)
|
|
sendMsg('text',message.content)
|
|
|
}else if(message.messageType === 'image'){
|
|
}else if(message.messageType === 'image'){
|
|
|
- // sendMsg('image','',{
|
|
|
|
|
- // originUrl:message.content
|
|
|
|
|
- // })
|
|
|
|
|
- sendMsg('image',message.content)
|
|
|
|
|
|
|
+ // 按新协议:不传 content,传 image 对象
|
|
|
|
|
+ sendMsg('image', '', { url: message.content, thumbnailUrl: message.content + resize })
|
|
|
}else if(message.messageType === 'dialog'){
|
|
}else if(message.messageType === 'dialog'){
|
|
|
// 对话样式消息不发送到服务器,只显示在本地
|
|
// 对话样式消息不发送到服务器,只显示在本地
|
|
|
console.log('发送对话样式消息:', message.content);
|
|
console.log('发送对话样式消息:', message.content);
|
|
@@ -661,7 +688,7 @@ const sendFarmReportDialog = () => {
|
|
|
.sent {
|
|
.sent {
|
|
|
justify-content: flex-end;
|
|
justify-content: flex-end;
|
|
|
.bubble {
|
|
.bubble {
|
|
|
- background-color: #2199f8;
|
|
|
|
|
|
|
+ background-color: #07c160;
|
|
|
border-radius: 10px 0 10px 10px;
|
|
border-radius: 10px 0 10px 10px;
|
|
|
padding: 10px 15px;
|
|
padding: 10px 15px;
|
|
|
color: #fff;
|
|
color: #fff;
|
|
@@ -742,6 +769,15 @@ const sendFarmReportDialog = () => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* 图片消息不使用对话气泡样式 */
|
|
|
|
|
+.no-bubble {
|
|
|
|
|
+ background: transparent !important;
|
|
|
|
|
+ border-radius: 0 !important;
|
|
|
|
|
+ padding: 0 !important;
|
|
|
|
|
+ box-shadow: none !important;
|
|
|
|
|
+ color: inherit !important;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.audio-message {
|
|
.audio-message {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|