update 群聊

This commit is contained in:
zengBin 2024-09-29 11:01:39 +08:00
parent 9d2bec920f
commit b99bce26e4
3 changed files with 203 additions and 280 deletions

View File

@ -7,9 +7,9 @@ var hostGo = ''
// if (_NODE_) {
// host = 'https://love.ufutx.com/api' // 线上环境
// hostGo = 'https://love.ufutx.com/go/api' // 线上环境
host = 'http://love.ufutx.net/go/api' // 本地环境
// hostGo = 'http://health.ufutx.net/go/api' // 本地环境
hostGo = 'https://love.ufutx.com/go/api' // 线上环境
// host = 'http://love.ufutx.net/go/api' // 本地环境
// hostGo = 'http://health.ufutx.net/go/api' // 本地环境
// } else {
// host = 'https://love.ufutx.com/api' // 线上环境
// }

View File

@ -560,7 +560,7 @@ page {
<template>
<view class="ui-chitchat">
<image class="m_tips_icon" src="https://image.fulllinkai.com/202305/05/2172ea48286be34e3a4e80a8c2a4571a.png" mode="aspectFit" @tap="reportShow = true"></image>
<scroll-view class="ui-scroll-view" style="height: {{windowHeight - bottomBoxH}}rpx;" scroll-y="true" upper-threshold="50" bindscrolltoupper="getHistoryMsg" scroll-into-view="{{toView}}" enable-flex="{{true}}">
<scroll-view class="ui-scroll-view" style="height: {{windowHeight - bottomBoxH}}rpx;" :scroll-y="scrollY" upper-threshold="50" bindscrolltoupper="getHistoryMsg" scroll-into-view="{{toView}}" enable-flex="{{true}}">
<view class="ui-top-placeholder"></view>
<block v-show="loading">
<image v-if="chatInfoData.other_real_approved != 1" class="ui-tips-pic" src="https://image.fulllinkai.com/202203/22/2a0d6bba0289f28b8d816e4deb1efa4c.png" mode="widthFix"></image>
@ -715,6 +715,7 @@ wepy.page({
recorderManager: wx.getRecorderManager(),
startPoint: 0,
scrollY: true,
sendLock: true, // audio发送锁
microphoneShow: false,
microphoneType: false, // 按住或松开
@ -838,7 +839,6 @@ wepy.page({
vm.openShow = false
vm.uploadState = true
vm.progressValue = 5
try {
app.globalData.nim.msg.sendImageMsg({
scene: 'p2p',
to: vm.otherUserId,
@ -876,9 +876,6 @@ wepy.page({
})
}
})
} catch (err) {
vm.sendFileError()
}
},
// 发送视频
sendVideos(file) {
@ -1081,6 +1078,8 @@ wepy.page({
}
if (item.content_type == 'text' && /\[[^\]]+\]/.test(item.content)) {
item.body = vm.transitionMsg(item.content)
} else {
item.body = item.content
}
vm.lastTime = format(item.time)
})
@ -1091,7 +1090,7 @@ wepy.page({
setTimeout(() => {
data.forEach((item) => {
vm.msgList.unshift({
text: item.content,
text: item.body,
attach: vm.calculatePic(item.attach, item.content_type),
id: `id_${item.time}`,
timestamp: item.time,
@ -1109,21 +1108,24 @@ wepy.page({
})
console.log(vm.msgList, data[0].time, '88888888888888888')
vm.$nextTick(() => {
if (vm.msgList.length < 8) {
vm.toView = `id_${data[0].time}`
if (vm.msgList.length > 15) {
vm.scrollY = false
}
vm.lastId = `${data[data.length - 1].id}`
vm.loading = true
// 防止撑开触发加载历史数据
setTimeout(() => {
vm.uploadState = false
vm.scrollY = true
}, 500)
})
})
} else {
vm.loading = true
vm.scrollY = true
}
if (data && data.length < 7) {
if (data && data.length < 15) {
vm.finished = true
}
}

View File

@ -529,7 +529,7 @@ page {
<template>
<view class="ui-groupChitchat">
<image class="m_tips_icon" @tap="jumpDetailPath" src="https://image.fulllinkai.com/202307/24/8c9d68ecf83230ea5e394aa98ef1765d.png" mode="aspectFit"></image>
<scroll-view class="ui-scroll-view" style="height: {{windowHeight - bottomBoxH}}rpx;" scroll-y="true" upper-threshold="50" bindscrolltoupper="getHistoryMsg" scroll-into-view="{{toView}}" enable-flex="{{true}}">
<scroll-view class="ui-scroll-view" style="height: {{windowHeight - bottomBoxH}}rpx;" :scroll-y="scrollY" upper-threshold="50" bindscrolltoupper="getHistoryMsg" scroll-into-view="{{toView}}" enable-flex="{{true}}">
<view class="ui-top-placeholder"></view>
<view class="ui-tips-box" v-show="loading">
<view class="font_28 color333 bold">
@ -543,7 +543,7 @@ page {
<view class="ui-msg-data-box" v-show="msgList.length > 0">
<!-- <view class="text-center font_2 ui-pb-24 color666" v-if="finished">没有更多消息了</view>-->
<view v-for="(item, index) in msgList" :key="index" class="ui-msg-data" id="{{item.id}}">
<block v-if="item.msgType == 'notification' && item.tips">
<block v-if="item.msgType == '7' && item.tips">
<!--群消息通知-->
<view class="text-center color999 font_24">{{item.tips}}</view>
</block>
@ -555,20 +555,20 @@ page {
<view class="ui-relative">
<view v-if="!item.isSelf && membersData.user_team.show_other_nick" class="font_26 color999 ui-pb-8">{{item.name}}</view>
<!--文本加表情信息-->
<view class="{{!item.isSelf ? 'ui-left-msg-radius ui-msg-left color3' : 'ui-right-msg-radius ui-msg-right white'}} font_28" v-if="item.msgType == 'text'">
<view class="{{!item.isSelf ? 'ui-left-msg-radius ui-msg-left color3' : 'ui-right-msg-radius ui-msg-right white'}} font_28" v-if="item.msgType == '0'">
<rich-text nodes="{{item.text}}"></rich-text>
</view>
<!--图片信息-->
<image v-if="item.msgType == 'image'" class="ui-msg-left-pic" :style="{maxWidth: item.attach.w + 'rpx', maxHeight: item.attach.h + 'rpx'}" :src="item.attach.url" mode="aspectFill" @tap.stop="previewImage(item.attach.url)"></image>
<image v-if="item.msgType == '1'" class="ui-msg-left-pic" :style="{maxWidth: item.attach.w + 'rpx', maxHeight: item.attach.h + 'rpx'}" :src="item.attach.url" mode="aspectFill" @tap.stop="previewImage(item.attach.url)"></image>
<!--音频信息-->
<view v-if="item.msgType == 'audio'" class="{{!item.isSelf ? 'ui-left-msg-radius ui-left-audio' : 'ui-right-msg-radius ui-right-audio white' }} ui-audio-box font_36 f-fc" :style="{width: item.audioDur < 20 ? '120rpx' :item.audioDur < 40 ? '180rpx' : '320rpx', maxWidth: '320rpx!important', minWidth: '120rpx!important'}" @tap.stop="playAudio(item.attach, index)">
<view v-if="item.msgType == '2'" class="{{!item.isSelf ? 'ui-left-msg-radius ui-left-audio' : 'ui-right-msg-radius ui-right-audio white' }} ui-audio-box font_36 f-fc" :style="{width: item.audioDur < 20 ? '120rpx' :item.audioDur < 40 ? '180rpx' : '320rpx', maxWidth: '320rpx!important', minWidth: '120rpx!important'}" @tap.stop="playAudio(item.attach, index)">
<image v-if="!item.isSelf" class="{{!audioState || playAudioIndex != index ? 'ui-audio-icon' : 'ui-audio-icon-l-play'}}" src="https://image.fulllinkai.com/202308/09/a0e320ef4f498309745d35f6798e970f.png" mode="aspectFit" lazy-load="false"></image>
<image v-else class="{{!audioState || playAudioIndex != index ? 'ui-audio-icon' : 'ui-audio-icon-r-play'}}" src="https://image.fulllinkai.com/202308/09/5514071f2d388102b5672e46ea1922f4.png" mode="aspectFit" lazy-load="false"></image>
<view v-if="!audioState || playAudioIndex != index">{{item.audioDur+ '"'}}</view>
<view v-else>{{audioTime + '"'}}</view>
</view>
<!--视频信息-->
<view v-if="item.msgType == 'video'" :style="{width: item.attach.w + 'rpx', height: item.attach.h + 'rpx', display: videoIndex == index ? 'none' : 'block'}" class="liveImg" mode="widthFix" @tap.stop="playVideo(index, item.id)">
<view v-if="item.msgType == '3'" :style="{width: item.attach.w + 'rpx', height: item.attach.h + 'rpx', display: videoIndex == index ? 'none' : 'block'}" class="liveImg" mode="widthFix" @tap.stop="playVideo(index, item.id)">
<image v-if="videoIndex != index" class="ui-video-box" :src="item.attach.poster" :style="{width: item.attach.w + 'rpx', height: item.attach.h + 'rpx'}">
<view class="ui-vide-poster">
<image class="ui-video_play_icon" src="https://image.fulllinkai.com/202308/17/42c88bf039bb56f85cfcb9af0392ffb6.png"></image>
@ -673,6 +673,7 @@ wepy.page({
recorderManager: wx.getRecorderManager(),
startPoint: 0,
scrollY: true,
sendLock: true, // audio发送锁
microphoneShow: false,
microphoneType: false, // 按住或松开
@ -707,6 +708,7 @@ wepy.page({
toView: '',
uploadState: false,
progressValue: 0, // 上传进度
lastId: '', // 历史记录分页数据最后一条id
lastTime: '', // 历史记录分页数据最后一条的时间戳
lastMsgId: '', // 历史记录分页数据最后一条的id
beginTime: '', // 历史记录分页数据最后一条的时间
@ -724,10 +726,10 @@ wepy.page({
// 获取群成员信息
getMembers() {
let vm = this
vm.$post({url: `${service.host}/chat/group/detail?team_id=${vm.otherUserId}`}).then(({code, data}) => {
vm.$get({url: `${service.host}/team/${vm.otherUserId}/detail`}).then(({code, data}) => {
if (code === 0) {
// 第一次进入页面的时候才请求历史消息
if (!vm.membersData.id) {
if (!vm.membersData.user_team) {
vm.$nextTick(() => {
// 获取历史消息
vm.getHistoryMsg()
@ -771,11 +773,6 @@ wepy.page({
send() {
let vm = this
let timeData = new Date().getTime()
let data = {
to_user_id: vm.otherUserId,
content: vm.msg,
type: 'text'
}
if (!vm.msg) {
vm.$showToast('请输入聊天内容')
return
@ -792,21 +789,16 @@ wepy.page({
name: vm.myName,
userId: vm.myUserId,
isSend: 0,
msgType: 'text'
msgType: '0'
})
vm.emojiShow = false
vm.msg = ''
vm.replyContent = ''
vm.toView = `id_${timeData}`
let msgIndex = 0
let msgNewObj = {}
msgIndex = vm.msgList.findIndex((e) => e.timestamp == timeData)
vm.$post({url: `${service.host}/chat/message/send`, data}).then(({code, data}) => {
if (code == 0) {
app.globalData.nim.msg.sendTextMsg({
scene: 'team',
to: vm.otherUserId,
body: data.content,
body: vm.msg,
isSend: 0,
onSendBefore: function (msg) {
console.log('get msg before', msg)
@ -814,7 +806,7 @@ wepy.page({
data.content = vm.transitionMsg(data.content)
}
msgNewObj = {
text: data.content,
text: vm.msg,
attach: '',
id: `id_${msg.time}`,
isSelf: true,
@ -824,34 +816,20 @@ wepy.page({
name: vm.myName,
userId: msg.from,
isSend: 1,
msgType: 'text'
msgType: '0'
}
vm.msgList.splice(msgIndex, 1, msgNewObj)
vm.lastTime = format(msg.time)
vm.callbackSend('text')
}
})
} else {
vm.msgList[msgIndex].isSend = 2
}
wx.hideLoading()
}).catch(() => {
vm.msgList[msgIndex].isSend = 2
wx.hideLoading()
})
},
// 发送图片消息
sendPictures(file) {
let vm = this
let data = {
to_user_id: vm.otherUserId,
content: vm.msg,
type: 'picture'
}
vm.openShow = false
vm.uploadState = true
vm.progressValue = 5
vm.$post({url: `${service.host}/chat/message/send`, data}).then(({code, data}) => {
if (code == 0) {
app.globalData.nim.msg.sendImageMsg({
scene: 'team',
to: vm.otherUserId,
@ -874,9 +852,10 @@ wepy.page({
name: msg.fromNick,
userId: msg.from,
isSend: 1,
msgType: 'image'
msgType: '1'
})
vm.lastTime = format(msg.time)
vm.callbackSend('picture')
vm.$nextTick(() => {
vm.toView = `id_${msg.time}`
})
@ -888,11 +867,6 @@ wepy.page({
})
}
})
}
wx.hideLoading()
}).catch(() => {
wx.hideLoading()
})
},
// 发送视频
sendVideos(file) {
@ -924,9 +898,10 @@ wepy.page({
name: msg.fromNick,
userId: msg.from,
isSend: 1,
msgType: 'video'
msgType: '3'
})
vm.lastTime = format(msg.time)
vm.callbackSend('video')
vm.$nextTick(() => {
vm.toView = `id_${msg.time}`
})
@ -969,9 +944,10 @@ wepy.page({
name: msg.fromNick,
userId: msg.from,
isSend: 1,
msgType: 'audio'
msgType: '2'
})
vm.lastTime = format(msg.time)
vm.callbackSend('audio')
vm.$nextTick(() => {
vm.toView = `id_${msg.time}`
})
@ -984,6 +960,24 @@ wepy.page({
}
})
},
// 发送信息后回调
callbackSend(type) {
let vm = this
let data = {
other_user_id: vm.otherUserId * 1,
field_7: vm.msg,
field_6: type
}
vm.$post({url: `${service.host}/chat/message/send`, data}).then(() => {
wx.hideLoading()
vm.msg = ''
vm.emojiShow = false
vm.replyContent = ''
}).catch(() => {
vm.uploadState = false
wx.hideLoading()
})
},
// 标记IM信息已读
sendMsgReceipt() {
let vm = this
@ -1027,7 +1021,6 @@ wepy.page({
},
// 获取历史消息数据
getHistoryMsg() {
let vm = this
let vm = this
let data = {
min_id: vm.lastId
@ -1039,7 +1032,8 @@ wepy.page({
return
}
vm.$showLoading('')
vm.$get({url: `${service.host}/chat/user/${vm.otherUserId}/message/list`, data}).then(({code, data}) => {
vm.$get({url: `${service.host}/chat/team/${vm.otherUserId}/message/list`, data}).then(({code, data}) => {
if (code === 0) {
console.log(data, '-------------------')
if (data && data.length > 0) {
@ -1048,58 +1042,70 @@ wepy.page({
// }
data.forEach((item, index) => {
item.time = new Date(item.create_time.replace(/[-]/g, '/').replace(/[-]/, '')).getTime()
item.attach = item.attach ? JSON.parse(item.attach) : ''
item.avatar = 'https://image.fulllinkai.com/202307/18/449c3253ca2bbed9314d39977a486d0e.png'
item.showTime = timeContrast(format(item.time), vm.lastTime)
item.timing = getTime(format(item.time))
if (item.showTime && index > 0) {
data[index].showTime = false
data[index - 1].showTime = true
}
if (item.content_type == 'text' && /\[[^\]]+\]/.test(item.content)) {
item.body = vm.transitionMsg(item.content)
if (item.type == '0' && /\[[^\]]+\]/.test(item.body_arr.msg)) {
item.body = vm.transitionMsg(item.body_arr.msg)
} else {
item.body = item.body_arr.msg
}
vm.lastTime = format(item.time)
})
// 获取成员头像后再循环获取数据
app.globalData.nim.user.getUsersNameCardFromServer({
accounts: [item.from]
}).then((res) => {
item.avatar = res[0].avatar
if (index + 1 == data.length) {
vm.lastMsgId = data[data.length - 1].id
vm.beginTime = data[data.length - 1].time
setTimeout(() => {
data.forEach((item) => {
vm.msgList.unshift({
text: item.content,
attach: vm.calculatePic(item.attach, item.content_type),
text: item.body,
attach: vm.calculatePic(item.body_arr, item.type),
id: `id_${item.time}`,
timestamp: item.time,
isSelf: item.is_mine == 0 ? false : true,
avatar: item.is_mine == 0 ? vm.otherAvatar : vm.myAvatar,
isSelf: item.is_mine == 'in' ? false : true,
avatar: item.is_mine == 'in' ? item.photo : vm.myAvatar,
time: item.timing,
showTime: item.showTime,
videoDur: item.content_type == 'video' ? getVideoTime(item.attach.dur) : '',
audioDur: item.content_type == 'audio' ? (item.attach.dur / 1000).toFixed(0) : '',
videoDur: item.type == '3' && item.body_arr.dur ? getVideoTime(item.body_arr.dur) : '',
audioDur: item.type == '2' && item.body_arr.dur ? (item.body_arr.dur / 1000).toFixed(0) : '',
name: item.fromNick,
isSend: 1,
userId: item.from,
msgType: item.content_type
msgType: item.type,
tips: vm.groupNotification(item)
})
})
console.log(vm.msgList, data[0].time, '88888888888888888')
console.log(vm.msgList, '88888888888888888')
vm.$nextTick(() => {
if (vm.msgList.length < 8) {
vm.toView = `id_${data[0].time}`
if (vm.msgList.length > 15) {
vm.scrollY = false
}
vm.lastId = `${data[data.length - 1].id}`
vm.loading = true
// 防止撑开触发加载历史数据
setTimeout(() => {
vm.uploadState = false
vm.scrollY = true
}, 500)
})
})
}
})
})
} else {
vm.loading = true
vm.scrollY = true
}
if (data && data.length < 7) {
if (data && data.length < 15) {
vm.finished = true
}
}
@ -1107,91 +1113,6 @@ wepy.page({
wx.hideLoading()
console.log(err)
})
// let data = {}
// if (vm.uploadState || vm.videoState) {
// return
// }
// if (!vm.lastMsgId) {
// data = {
// scene: 'team',
// to: vm.otherUserId,
// limit: 15
// }
// } else {
// data = {
// scene: 'team',
// to: vm.otherUserId,
// limit: 15,
// reverse: false,
// endTime: vm.beginTime,
// lastMsgId: vm.lastMsgId
// }
// }
// if (vm.finished) {
// return
// }
// vm.$showLoading('')
// app.globalData.nim.msgLog.getHistoryMsgs(data).then((object) => {
// if (object && object.length > 0) {
// if (vm.msgList && vm.msgList.length == 0) {
// // 标记IM消息已读
// vm.sendMsgReceipt()
// }
// object.forEach((item, index) => {
// item.avatar = 'https://image.fulllinkai.com/202307/18/449c3253ca2bbed9314d39977a486d0e.png',
// item.showTime = timeContrast(format(item.time), vm.lastTime)
// item.timing = getTime(format(item.time))
// if (item.showTime && index > 0) {
// object[index].showTime = false
// object[index - 1].showTime = true
// }
// if (item.type == 'text' && /\[[^\]]+\]/.test(item.body)) {
// item.body = vm.transitionMsg(item.body)
// }
// vm.lastTime = format(item.time)
// // 获取成员头像后再循环获取数据
// app.globalData.nim.user.getUsersNameCardFromServer({
// accounts: [item.from]
// }).then((res) => {
// item.avatar = res[0].avatar
// if (index + 1 == object.length) {
// vm.lastMsgId = object[object.length - 1].idServer
// vm.beginTime = object[object.length - 1].time
//
// setTimeout(() => {
// object.forEach((item) => {
// vm.msgList.unshift({
// text: item.body,
// attach: vm.calculatePic(item.attach, item.type),
// id: `id_${item.time}`,
// timestamp: item.time,
// isSelf: item.flow == 'in' ? false : true,
// avatar: item.flow == 'in' ? item.avatar : vm.myAvatar,
// time: item.timing,
// showTime: item.showTime,
// videoDur: item.type == 'video' ? getVideoTime(item.attach.dur) : '',
// audioDur: item.type == 'audio' ? (item.attach.dur / 1000).toFixed(0) : '',
// name: item.fromNick,
// userId: item.from,
// msgType: item.type,
// tips: vm.groupNotification(item)
// })
// })
// console.log(vm.msgList, '88888888888888888')
// vm.toView = `id_${object[0].time}`
// vm.loading = true
// })
// }
// })
// })
// } else {
// vm.loading = true
// }
// if (object && object.length < 15) {
// vm.finished = true
// }
// wx.hideLoading()
// })
},
// 监听底部输入框的高度
changeInputHeight(e) {
@ -1392,23 +1313,23 @@ wepy.page({
// 群通知消息判断
groupNotification (e) {
let text = ``
if (e.type == 'notification' && e.attach.type == 'addTeamMembers') {
if (e.type == '7' && e.attach.type == 'addTeamMembers') {
text = `${e.attach.users[1].nick}邀请${e.attach.users[0].nick}加入群`
}
if (e.type == 'notification' && e.attach.type == 'leaveTeam') {
if (e.type == '7' && e.attach.type == 'leaveTeam') {
text = `${e.attach.users[0].nick}离开群`
}
return text
},
// 图片大小计算
calculatePic(e, type) {
if (!e) {
if (!e.url) {
return ''
}
let wRatio = 0
if (type == 'video' && e.url && e.url.includes('?')) {
if (type == '3' && e.url && e.url.includes('?')) {
e.poster = `${e.url}&vframe`
} else if (type == 'video' && e.url) {
} else if (type == '3' && e.url) {
e.poster = `${e.url}?vframe`
}
if (e.w > e.h) {
@ -1523,7 +1444,7 @@ wepy.page({
let vm = this
let imageArr = []
vm.msgList.forEach((item) => {
if (item.msgType == 'image') {
if (item.msgType == '1') {
imageArr.push(item.attach.url)
}
})