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 @@
+
+
+
+
+
+ {{ extra.content }}
+
+
+
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