From 8ed2bf7113162971e433833d1bed8918ae5ff6d8 Mon Sep 17 00:00:00 2001 From: wangyifeng <812766448@qq.com> Date: Tue, 25 Mar 2025 19:40:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=90=84=E7=A7=8D=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E7=83=AD=E6=9B=B4=E6=96=B0=EF=BC=9B=E6=96=B0=E5=A2=9E?= =?UTF-8?q?1106=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B=E5=A4=84=E7=90=86?= =?UTF-8?q?=E8=A7=A3=E6=95=A3=EF=BC=9B=E7=BE=A4=E8=81=8A=E6=8C=89=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E8=A7=86=E9=A2=91=E7=B1=BB=E5=9E=8B=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE=EF=BC=9B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=89=E6=8B=A9=E5=9B=BE=E7=89=87=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=BAplus=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 3 +- src/components/talk/message/ImageMessage.vue | 2 +- .../talk/message/system/SysGroupDismissed.vue | 19 ++++ src/constant/message.ts | 2 +- src/event/talk.js | 49 +++++++-- src/pages/chatSettings/index.vue | 16 ++- src/pages/dialog/components/filePanel.vue | 61 +++++++++--- src/pages/index/components/chatItem.vue | 14 ++- src/pages/search/searchByCondition/index.vue | 99 ++++++++++++++++--- src/store/modules/dialogue.js | 10 ++ 10 files changed, 228 insertions(+), 47 deletions(-) create mode 100644 src/components/talk/message/system/SysGroupDismissed.vue diff --git a/components.d.ts b/components.d.ts index 334d110..f93eeb3 100644 --- a/components.d.ts +++ b/components.d.ts @@ -30,8 +30,6 @@ declare module 'vue' { LoginMessage: typeof import('./src/components/talk/message/LoginMessage.vue')['default'] Message: typeof import('./src/components/x-message/message/index.vue')['default'] MixedMessage: typeof import('./src/components/talk/message/MixedMessage.vue')['default'] - NButton: typeof import('naive-ui')['NButton'] - NIcon: typeof import('naive-ui')['NIcon'] PageAnimation: typeof import('./src/components/page-animation/index.vue')['default'] RevokeMessage: typeof import('./src/components/talk/message/RevokeMessage.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] @@ -39,6 +37,7 @@ declare module 'vue' { SysGroupAdminMessage: typeof import('./src/components/talk/message/system/SysGroupAdminMessage.vue')['default'] SysGroupCancelMutedMessage: typeof import('./src/components/talk/message/system/SysGroupCancelMutedMessage.vue')['default'] SysGroupCreateMessage: typeof import('./src/components/talk/message/system/SysGroupCreateMessage.vue')['default'] + SysGroupDismissed: typeof import('./src/components/talk/message/system/SysGroupDismissed.vue')['default'] SysGroupInfoChangeMessage: typeof import('./src/components/talk/message/system/SysGroupInfoChangeMessage.vue')['default'] SysGroupJoinMessage: typeof import('./src/components/talk/message/system/SysGroupJoinMessage.vue')['default'] SysGroupMemberCancelMutedMessage: typeof import('./src/components/talk/message/system/SysGroupMemberCancelMutedMessage.vue')['default'] diff --git a/src/components/talk/message/ImageMessage.vue b/src/components/talk/message/ImageMessage.vue index c7ed9b9..8a84a27 100644 --- a/src/components/talk/message/ImageMessage.vue +++ b/src/components/talk/message/ImageMessage.vue @@ -58,7 +58,7 @@ const img = computed(() => { }" >
- +
diff --git a/src/components/talk/message/system/SysGroupDismissed.vue b/src/components/talk/message/system/SysGroupDismissed.vue new file mode 100644 index 0000000..9b3d098 --- /dev/null +++ b/src/components/talk/message/system/SysGroupDismissed.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/constant/message.ts b/src/constant/message.ts index a421418..5b7b8b3 100644 --- a/src/constant/message.ts +++ b/src/constant/message.ts @@ -85,7 +85,7 @@ export const MessageComponents = { [ChatMsgSysGroupMemberQuit]: 'sys-group-member-quit-message', [ChatMsgSysGroupMemberKicked]: 'sys-group-member-kicked-message', // [ChatMsgSysGroupMessageRevoke]: '[撤回消息]', - // [ChatMsgSysGroupDismissed]: '[群解散消息]', + [ChatMsgSysGroupDismissed]: 'sys-group-dismissed', [ChatMsgSysGroupMuted]: 'sys-group-muted-message', [ChatMsgSysGroupCancelMuted]: 'sys-group-cancel-muted-message', [ChatMsgSysGroupMemberMuted]: 'sys-group-member-muted-message', diff --git a/src/event/talk.js b/src/event/talk.js index 5d7bc0e..4a9579b 100644 --- a/src/event/talk.js +++ b/src/event/talk.js @@ -125,22 +125,27 @@ class Talk extends Base { this.insertTalkRecord() } else { this.updateTalkItem() - if (typeof plus !== 'undefined') { - let OAWebView = plus.webview.all() - OAWebView.forEach((webview) => { - if (webview.id === 'webviewId1') { - webview.evalJS(`updateUnreadMsgNumAdd()`) - } - }) - } else { - document.addEventListener('plusready', () => { + if ( + !useTalkStore().items[useTalkStore().findTalkIndex(this.getIndexName())] + .is_disturb + ) { + if (typeof plus !== 'undefined') { let OAWebView = plus.webview.all() OAWebView.forEach((webview) => { if (webview.id === 'webviewId1') { webview.evalJS(`updateUnreadMsgNumAdd()`) } }) - }) + } else { + document.addEventListener('plusready', () => { + let OAWebView = plus.webview.all() + OAWebView.forEach((webview) => { + if (webview.id === 'webviewId1') { + webview.evalJS(`updateUnreadMsgNumAdd()`) + } + }) + }) + } } } } @@ -204,6 +209,30 @@ class Talk extends Base { if ([1102, 1103, 1104, 1115].includes(record.msg_type)) { useDialogueStore().updateGroupMembers() } + + //群解散时,需要更新群成员权限 + if ([1106].includes(record.msg_type)) { + useDialogueStore().updateDismiss() + } + + //群成员被移出时,需要更新群成员权限 + if ([1104, 1115].includes(record.msg_type)) { + useDialogueStore().updateQuit() + } + + //群禁言变化时,需要更新群禁言状态——即更新群成员列表 + if ([1107, 1108, 1109, 1110].includes(record.msg_type)) { + useDialogueStore().updateGroupMembers() + } + //群公告变化时,需要更新群公告(新增和修改有热更新,删除没有) + if ([13].includes(record.msg_type)) { + useGroupStore().ServeGetGroupNotices() + } + //群管理员变化时,需要更新群管理员列表——即更新群成员列表,同时更新群信息 + if ([1114].includes(record.msg_type)) { + useDialogueStore().updateGroupMembers() + useGroupStore().ServeGroupDetail() + } if ([1116].includes(record.msg_type)) { // 更新会话信息 useDialogueStore().setDialogue({ diff --git a/src/pages/chatSettings/index.vue b/src/pages/chatSettings/index.vue index 0afb54d..c0dca72 100644 --- a/src/pages/chatSettings/index.vue +++ b/src/pages/chatSettings/index.vue @@ -267,8 +267,8 @@ onLoad(async (options) => { if (options.groupId) { console.log(options.groupId) state.groupId = Number(options.groupId) - await groupStore.ServeGroupDetail() if (dialogueParams.type === 2) { + await groupStore.ServeGroupDetail() await groupStore.ServeGetGroupNotices() } } @@ -566,7 +566,10 @@ const showConfirmPrompt = (flag) => { confirmContent = t('group.dismiss.confirm') } else if (flag === 3) { //最后一个管理员退群就解散群聊 - if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + if ( + dialogueParams.adminList.length === 1 && + dialogueParams.adminList[0].id === dialogueParams.uid + ) { //解散群聊 confirmContent = t('ok') + t('group.quit.btn') subContent = t('groupManage.disband.hint') @@ -604,7 +607,10 @@ const showConfirmPrompt = (flag) => { } } else if (flag === 3) { //最后一个管理员退群就解散群聊 - if (dialogueParams.adminList.length === 1 && dialogueParams.adminList[0].id === dialogueParams.uid) { + if ( + dialogueParams.adminList.length === 1 && + dialogueParams.adminList[0].id === dialogueParams.uid + ) { //解散群聊 let params = { group_id: dialogueParams.receiver_id, //群id @@ -624,7 +630,9 @@ const showConfirmPrompt = (flag) => { group_id: dialogueParams.receiver_id, }).then(({ code, message }) => { if (code == 200) { - // dialogueStore.apiClearRecord() + uni.navigateBack({ + delta: 2, + }) } else { } }) diff --git a/src/pages/dialog/components/filePanel.vue b/src/pages/dialog/components/filePanel.vue index b0769fa..22553d9 100644 --- a/src/pages/dialog/components/filePanel.vue +++ b/src/pages/dialog/components/filePanel.vue @@ -72,7 +72,7 @@ const props = defineProps({ }) const state = reactive({ - base64Url: '' + base64Url: '', }) const uploadsStore = useUploadsStore() @@ -94,17 +94,54 @@ const onProgressFn = (progress, id) => { const photoActionsSelect = (index) => { if (index === 0) { - uni.chooseImage({ - sourceType: ['album'], - count: 9, - success: async (res) => { - console.log(res, 'res') - res.tempFiles.forEach(async (file) => { - let data = await onUploadImageVideo(file, 'image') - emit('selectImg', data, data.file_num) - }) - }, - }) + if (typeof plus === 'undefined') { + uni.chooseImage({ + sourceType: ['album'], + count: 9, + success: async (res) => { + console.log(res, 'res') + res.tempFiles.forEach(async (file) => { + let data = await onUploadImageVideo(file, 'image') + emit('selectImg', data, data.file_num) + }) + }, + }) + } else { + plus?.gallery.pick( + (res) => { + console.log(res, 'res') + res.files.reverse() + res.files.forEach(async (filePath) => { + plus?.io?.resolveLocalFileSystemURL( + filePath, + async (entry) => { + entry.file((file) => { + const fileReader = new plus.io.FileReader() + fileReader.readAsDataURL(file) + fileReader.onloadend = async (e) => { + const base64Url = e.target.result + const fileObj = base64ToFile(base64Url) + let data = await onUploadImageVideo(fileObj, 'image') + emit('selectImg', data, data.file_num) + } + }) + }, + (err) => { + console.log(err) + }, + ) + }) + }, + (err) => { + console.log(err) + }, + { + filter: 'image', + maximum: 9, + multiple: true, + }, + ) + } } else { uni.chooseVideo({ sourceType: ['album'], diff --git a/src/pages/index/components/chatItem.vue b/src/pages/index/components/chatItem.vue index 61a0200..b2cd819 100644 --- a/src/pages/index/components/chatItem.vue +++ b/src/pages/index/components/chatItem.vue @@ -65,6 +65,9 @@
+ + [有人@你] + {{ props.data.msg_text }}
@@ -135,10 +138,13 @@ const cellClick = () => { // 清空消息未读数 if (props.data.unread_num > 0) { - ServeClearTalkUnreadNum({ - talk_type: props.data.talk_type, - receiver_id: props.data.receiver_id, - },dialogueParams.unReadNum).then(() => { + ServeClearTalkUnreadNum( + { + talk_type: props.data.talk_type, + receiver_id: props.data.receiver_id, + }, + dialogueParams.unReadNum, + ).then(() => { talkStore.updateItem({ index_name: props.data.index_name, unread_num: 0, diff --git a/src/pages/search/searchByCondition/index.vue b/src/pages/search/searchByCondition/index.vue index 1cae687..362b5e4 100644 --- a/src/pages/search/searchByCondition/index.vue +++ b/src/pages/search/searchByCondition/index.vue @@ -123,7 +123,10 @@ state.condition === 'imgAndVideo' ? '0 0 10rpx' : '', }" > -
+
- + +
+
+ +
@@ -263,13 +285,14 @@ import fileType_EXCEL from '@/static/image/search/fileType_EXCEL.png' import fileType_WORD from '@/static/image/search/fileType_WORD.png' import fileType_PDF from '@/static/image/search/fileType_PDF.png' import fileType_Files from '@/static/image/search/fileType_Files.png' +import playCircle from "@/static/image/chatList/playCircle@2x.png" import { fileFormatSize, fileSuffix } from '@/utils/strings' import searchItem from '../components/searchItem.vue' import customInput from '@/components/custom-input/custom-input.vue' import ZPaging from '@/uni_modules/z-paging/components/z-paging/z-paging.vue' import useZPaging from '@/uni_modules/z-paging/components/z-paging/js/hooks/useZPaging.js' import { parseTime } from '@/utils/datetime' -import { onMounted, reactive, computed, ref } from 'vue' +import { onMounted, reactive, computed, ref, nextTick } from 'vue' import { onLoad } from '@dcloudio/uni-app' import { ServeTalkDate, ServeGetSessionId } from '@/api/search/index' import { ServeFindTalkRecords } from '@/api/chat/index' @@ -308,6 +331,37 @@ const state = reactive({ flatList: [], // 用于存储扁平化的数据 }) +const videoContext = ref() +const open = ref(false) +const currentVideoUrl = ref('') + +const fullscreenchange = (e) => { + if (!e.detail.fullScreen) { + videoContext.value.stop() + videoContext.value.seek(0) + open.value = false + } +} + +async function onPlay(url) { + currentVideoUrl.value = url + open.value = true + + // 等待 DOM 更新 + await nextTick() + + // 创建新的视频上下文 + videoContext.value = uni.createVideoContext(url, getCurrentInstance()) + + // 先请求全屏 + videoContext.value.requestFullScreen({ direction: 2 }) + + // 延迟一下再播放,确保全屏已经完成 + setTimeout(() => { + videoContext.value.play() + }, 100) +} + onLoad((options) => { console.log(options) if (options.condition) { @@ -829,6 +883,25 @@ body::v-deep .round-3 { width: 164rpx !important; height: 164rpx !important; } + .video-preview { + position: relative; + width: 164rpx; + height: 164rpx; + cursor: pointer; + .play-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + img{ + width: 80rpx !important; + height: 80rpx !important; + } + display: flex; + align-items: center; + justify-content: center; + } + } } } } diff --git a/src/store/modules/dialogue.js b/src/store/modules/dialogue.js index 07f64ad..d3595da 100644 --- a/src/store/modules/dialogue.js +++ b/src/store/modules/dialogue.js @@ -98,6 +98,16 @@ export const useDialogueStore = defineStore('dialogue', { this.unreadNum = 0 }, + // 更新群解散状态 + updateDismiss() { + this.isDismiss = true + }, + + // 更新群成员退出状态 + updateQuit() { + this.isQuit = true + }, + // 更新对话信息 setDialogue(data = {}) { this.online = data.is_online == 1