From 92a7d74c6c423fc387a4feff95c09949c54749e7 Mon Sep 17 00:00:00 2001 From: wangyifeng <812766448@qq.com> Date: Wed, 19 Mar 2025 19:58:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E6=8C=89=E7=BE=A4=E6=88=90?= =?UTF-8?q?=E5=91=98=E6=90=9C=E7=B4=A2=E8=81=8A=E5=A4=A9=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E4=B8=8E=E8=B7=B3=E8=BD=AC=EF=BC=9B=E5=A4=84=E7=90=86=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E4=BF=A1=E6=81=AF=E6=8E=A8=E9=80=81=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=8E=A5=E6=94=B6=E4=B8=8E=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 35 +++++++++++ .../components/selectMemberByAlphabet.vue | 2 +- src/pages/dialog/index.vue | 62 +++++++++++++----- src/pages/search/components/searchItem.vue | 14 +++++ src/pages/search/searchByCondition/index.vue | 63 +++++++++++++++---- src/store/modules/talk.js | 1 + 6 files changed, 150 insertions(+), 27 deletions(-) diff --git a/src/main.js b/src/main.js index b6e6ad7..5a9a805 100644 --- a/src/main.js +++ b/src/main.js @@ -14,6 +14,7 @@ import { vLoading } from '@/components/x-loading/index.js' import messagePopup from '@/components/x-message/useMessagePopup' import pageAnimation from '@/components/page-animation/index.vue' import * as plugins from './plugins' +import { useDialogueStore, useTalkStore } from '@/store' const { showMessage } = messagePopup() dayjs.locale('zh-cn') if (import.meta.env.VITE_SHOW_CONSOLE === 'true') { @@ -40,6 +41,40 @@ export function createApp() { }) }, }) + + //获取当前聊天页面所在页面,并通过当前的receiver_id判断是否要创建本地通知栏消息 + window.getCurrentChatRoute = (msg) => { + let pushMsg = JSON.parse(decodeURIComponent(msg)) + //当前所在聊天会话的receiver_id + const receiver_id = pushMsg?.payload?.receiver_id + // 获取当前页面路径 + const pages = getCurrentPages() + const page = pages[pages.length - 1] + console.log(page.route) + + const dialogueStore = useDialogueStore() + console.log(dialogueStore?.talk?.receiver_id) + if ( + page?.route === 'pages/dialog/index' && + receiver_id === dialogueStore?.talk?.receiver_id + ) { + return + } + let OAWebView = plus.webview.all() + //all里面第一个是入口webview + OAWebView[0].evalJS(`doCreatePushMessage('${msg}')`) + } + + //处理聊天推送弹窗点开 + window.openUniPushMsg = (msg) => { + console.log("=====点击通知栏消息") + let pushMsg = JSON.parse(decodeURIComponent(msg)) + //由于弹窗前处理了不该弹窗的场景,因此这里弹窗可以一并处理 + //也就是都跳转到聊天页面 + const talkStore = useTalkStore() + talkStore.toTalk(pushMsg?.payload?.talk_type, pushMsg?.payload?.receiver_id) + } + window.message = ['success', 'error', 'warning'].reduce((acc, type) => { acc[type] = (message) => { if (typeof message === 'string') { diff --git a/src/pages/chatSettings/components/selectMemberByAlphabet.vue b/src/pages/chatSettings/components/selectMemberByAlphabet.vue index 72547bf..6c8780f 100644 --- a/src/pages/chatSettings/components/selectMemberByAlphabet.vue +++ b/src/pages/chatSettings/components/selectMemberByAlphabet.vue @@ -381,7 +381,7 @@ const handleClickItem = (item) => { } if(props?.manageType === 'searchRecord'){ uni.navigateTo({ - url: '/pages/search/searchByCondition/index?condition=member' + url: '/pages/search/searchByCondition/index?condition=member&groupMemberId=' + item.id }) return } diff --git a/src/pages/dialog/index.vue b/src/pages/dialog/index.vue index a01e1e1..b2eb6a9 100644 --- a/src/pages/dialog/index.vue +++ b/src/pages/dialog/index.vue @@ -561,13 +561,18 @@ const state = ref({ useCustomLoadMore: false, //是否使用自定义加载更多事件(下拉刷新、上拉加载) recordDate: '', //按日期查询聊天记录的开始日期 serveFindRecord: [], //调用接口查找到的聊天记录 + middleMsg: {}, //缓存中没有时,调用接口初次使用的依据记录 + keepDialogInfo: false, //是否保存会话信息 }) uniOnload(async (options) => { - console.log('onLoad' + options) + console.log('onLoad' + JSON.stringify(options)) if (options.sessionId) { state.value.sessionId = options.sessionId } + if (options.keepDialogInfo) { + state.value.keepDialogInfo = options.keepDialogInfo === '1' ? true : false + } if (options.msgInfo) { const msgInfo = JSON.parse(decodeURIComponent(options.msgInfo)) queryRecordsByMsgInfo(msgInfo) @@ -974,11 +979,11 @@ const withdrawerConfirm = () => { // 添加检查是否可以重新编辑撤回消息的函数 const canEditRevokedMessage = (item) => { - console.log(item) + // console.log(item) if (item.is_revoke === 1 && item.msg_type === 1) { const now = new Date().getTime() const revokeTime = new Date(item.created_at).getTime() - console.log(now) + // console.log(now) // 检查是否在5分钟内 return now - revokeTime <= 5 * 60 * 1000 } @@ -1099,14 +1104,17 @@ watch( state.value.localPageLoadDone = true return } - if ( - newValue[newValue.length - 1]?.sequence === - dialogueList?.records?.[0]?.sequence - ) { - //相同意味着分页加载缓存中的聊天记录完毕 - state.value.localPageLoadDone = true - } else { - state.value.localPageLoadDone = false + // 只在正常加载模式下检查是否加载完缓存数据 + if (!state.value.useCustomLoadMore) { + if ( + newValue[newValue.length - 1]?.sequence === + dialogueList?.records?.[0]?.sequence + ) { + //相同意味着分页加载缓存中的聊天记录完毕 + state.value.localPageLoadDone = true + } else { + state.value.localPageLoadDone = false + } } } }, @@ -1134,7 +1142,13 @@ const onScrollToLower = async () => { ) console.log(moreRecords) - virtualList.value = moreRecords.concat(tempVirtualList).reverse() + // 格式化新加载的消息 + const formattedMoreRecords = moreRecords.map((item) => ({ + ...item, + float: item.user_id === talkParams.uid ? 'right' : 'left', + })) + + virtualList.value = formattedMoreRecords.concat(tempVirtualList).reverse() console.log(virtualList.value) } else { @@ -1181,7 +1195,16 @@ const onScrollToUpper = async () => { tempVirtualList[tempVirtualList.length - 1].sequence, ) console.log(moreRecords) - virtualList.value = tempVirtualList.concat(moreRecords.reverse()).reverse() + + // 格式化新加载的消息 + const formattedMoreRecords = moreRecords.map((item) => ({ + ...item, + float: item.user_id === talkParams.uid ? 'right' : 'left', + })) + + virtualList.value = tempVirtualList + .concat(formattedMoreRecords.reverse()) + .reverse() console.log(virtualList.value) @@ -1309,6 +1332,7 @@ const getMentionSelectLists = (mentionSelectList) => { //根据msg信息找到对应的聊天记录,并根据sequence等查看上下文 const queryRecordsByMsgInfo = async (msgInfo) => { console.log(msgInfo) + state.value.middleMsg = msgInfo const dialogueList = getDialogueList(talkParams.index_name) const recordIndex = dialogueList?.records?.findIndex( (record) => record.msg_id === msgInfo.msg_id, @@ -1325,6 +1349,15 @@ const queryRecordsByMsgInfo = async (msgInfo) => { // console.log(recordIndex-startRecordIndex) recordsList = dialogueList.records.slice(startRecordIndex, endRecordIndex) } + + // 格式化消息,确保每条消息都有正确的 float + recordsList = recordsList.map((item) => { + return { + ...item, + float: item.user_id === talkParams.uid ? 'right' : 'left', + } + }) + nextTick(() => { zpagingRef.value.complete(recordsList.reverse()) loadConfig.status = dialogueList?.records?.[0]?.sequence > 1 ? 1 : 2 @@ -1376,6 +1409,7 @@ const findTalkRecords = (record, isMiddle, sequence, appointParams) => { end_time: '', group_member_user_id: 0, //群成员id,当查询群历史消息的时候,需要指定群成员的时候送 sort_sequence: 'asc', + create_time: state.value.middleMsg.created_at, } if (record) { params = Object.assign({}, params, { @@ -1474,7 +1508,7 @@ const rpxToPx = (rpx) => { } onUnmounted(() => { - if (!state.value.recordDate) { + if (!state.value.keepDialogInfo) { dialogueStore.setDialogue({}) } clearMultiSelect() diff --git a/src/pages/search/components/searchItem.vue b/src/pages/search/components/searchItem.vue index fadbcf3..e7bc426 100644 --- a/src/pages/search/components/searchItem.vue +++ b/src/pages/search/components/searchItem.vue @@ -96,6 +96,7 @@ import { import HighlightText from './highLightText.vue' import { useI18n } from 'vue-i18n' import { beautifyTime } from '@/utils/datetime' +import { ChatMsgTypeMapping } from '@/constant/message' const { t } = useI18n() const props = defineProps({ searchItem: Object | Number, @@ -175,6 +176,13 @@ const keyMapping = { name: 'receiver_name', group_num: 'group_num', }, + search_by_member_condition: { + avatar: 'avatar', + name: 'nickname', + created_at: 'created_at', + msg_type: 'msg_type', + detailKey: 'chatMessageType', + }, } //获取key对应值 const getKeyValue = (keys) => { @@ -254,6 +262,12 @@ const resultDetail = computed(() => { case 'extra': result_detail = props.searchItem?.extra break + case 'chatMessageType': + result_detail = + props.searchItem?.msg_type === 1 + ? props.searchItem?.extra?.content + : ChatMsgTypeMapping[props.searchItem?.msg_type] + break default: result_detail = '' } diff --git a/src/pages/search/searchByCondition/index.vue b/src/pages/search/searchByCondition/index.vue index f424d2e..1cae687 100644 --- a/src/pages/search/searchByCondition/index.vue +++ b/src/pages/search/searchByCondition/index.vue @@ -9,6 +9,7 @@ :auto="false" :loading-more-default-as-loading="true" :inside-more="true" + v-model="state.flatList" >