diff --git a/package.json b/package.json index ebed267..b0c814e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "@highlightjs/vue-plugin": "^2.1.0", "@iconify-json/ion": "^1.2.3", "@kangc/v-md-editor": "^2.3.18", + "@onlyoffice/document-editor-vue": "^1.5.0", + "@vicons/fluent": "^0.13.0", "@vicons/ionicons5": "^0.13.0", "@vueup/vue-quill": "^1.2.0", "@vueuse/core": "^10.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f7ce39..eb00edc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,12 @@ importers: '@kangc/v-md-editor': specifier: ^2.3.18 version: 2.3.18(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.2.2)) + '@onlyoffice/document-editor-vue': + specifier: ^1.5.0 + version: 1.5.0(vue@3.5.13(typescript@5.2.2)) + '@vicons/fluent': + specifier: ^0.13.0 + version: 0.13.0 '@vicons/ionicons5': specifier: ^0.13.0 version: 0.13.0 @@ -594,6 +600,11 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@onlyoffice/document-editor-vue@1.5.0': + resolution: {integrity: sha512-HZEebUhBloP4LomspI5BddgoQdhtPq91h57yA9K/Lk70MMc1vgOTQ4Wq+N5TZYXNxdDTv+TSsEVFLnBCl1Y71A==} + peerDependencies: + vue: ^3.0.0 + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -988,6 +999,9 @@ packages: peerDependencies: vue: ^3.0.0 + '@vicons/fluent@0.13.0': + resolution: {integrity: sha512-bYGZsOE3qzvm3Cm43e7tybgGlr5ZUpYqtRZq0g0Tfupe8jIzLolpvQLNUt1zS8Mgt6goTbUk5YH7Fkv16jkykg==} + '@vicons/ionicons5@0.13.0': resolution: {integrity: sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==} @@ -4012,6 +4026,11 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@onlyoffice/document-editor-vue@1.5.0(vue@3.5.13(typescript@5.2.2))': + dependencies: + lodash: 4.17.21 + vue: 3.5.13(typescript@5.2.2) + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -4390,6 +4409,8 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.2.2) + '@vicons/fluent@0.13.0': {} + '@vicons/ionicons5@0.13.0': {} '@vitejs/plugin-vue-jsx@3.1.0(vite@6.3.5(@types/node@18.19.99)(jiti@1.21.7)(less@4.3.0)(sass@1.88.0)(terser@5.39.2))(vue@3.5.13(typescript@5.2.2))': diff --git a/src/assets/css/define/global.less b/src/assets/css/define/global.less index 72a727f..d8414a1 100644 --- a/src/assets/css/define/global.less +++ b/src/assets/css/define/global.less @@ -206,7 +206,7 @@ textarea { border-radius: 2px; cursor: default; user-select: none; - background-color: #dee0e3; + transform: scale(0.84); transform-origin: left; flex-shrink: 0; diff --git a/src/assets/image/dofd.png b/src/assets/image/dofd.png new file mode 100644 index 0000000..b5c359b Binary files /dev/null and b/src/assets/image/dofd.png differ diff --git a/src/assets/image/xxxx@2x.png b/src/assets/image/xxxx@2x.png new file mode 100644 index 0000000..2d75fe7 Binary files /dev/null and b/src/assets/image/xxxx@2x.png differ diff --git a/src/components/talk/message/FileMessage.vue b/src/components/talk/message/FileMessage.vue index a2de9c6..69ad4eb 100644 --- a/src/components/talk/message/FileMessage.vue +++ b/src/components/talk/message/FileMessage.vue @@ -7,7 +7,8 @@ import excelText from '@/assets/image/excel-text.png' import wordText from '@/assets/image/word-text.png' import pdfText from '@/assets/image/pdf-text.png' import fileText from '@/assets/image/file-text.png' - +import { ArrowDownload16Filled } from '@vicons/fluent' +import { download } from '@/utils/functions.js' // 定义组件属性 const props = defineProps({ // 文件的额外信息 @@ -92,6 +93,20 @@ const handleClick = () => { 'width=1200,height=900,left=200,top=200,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=no,status=no' ); } + +// 处理下载事件 +const handleDownload = () => { + download(props.data.msg_id) + // const url = props.extra.path; + // if (!url) return; + // const a = document.createElement('a'); + // a.href = url; + // a.download = url.split('/').pop() || 'download'; + // document.body.appendChild(a); + // a.click(); + // document.body.removeChild(a); + console.log('data',props.data) +} diff --git a/src/components/talk/message/TextMessage.vue b/src/components/talk/message/TextMessage.vue index 11561cf..49895dc 100644 --- a/src/components/talk/message/TextMessage.vue +++ b/src/components/talk/message/TextMessage.vue @@ -43,7 +43,7 @@ textContent = textReplaceEmoji(textContent) min-height: 30px; padding: 3px; color: var(--im-message-left-text-color); - background: var(--im-message-left-bg-color); + background: #F4F4FC; border-radius: 0px 10px 10px 10px; font-size: 14px; &.right { diff --git a/src/hooks/useSessionMenu.ts b/src/hooks/useSessionMenu.ts index 4e5d8b6..4a22416 100644 --- a/src/hooks/useSessionMenu.ts +++ b/src/hooks/useSessionMenu.ts @@ -1,17 +1,5 @@ import { reactive, nextTick, computed, h, inject } from 'vue' import { ISession } from '@/types/chat' -import { renderIcon } from '@/utils/util' -import { - ArrowUp, - ArrowDown, - Logout, - Delete, - Clear, - Remind, - CloseRemind, - EditTwo, - IdCard -} from '@icon-park/vue-next' import { ServeTopTalkList, ServeDeleteTalkList, ServeSetNotDisturb } from '@/api/chat' import { useDialogueStore, useTalkStore } from '@/store' import { ServeSecedeGroup } from '@/api/group' @@ -52,45 +40,45 @@ export function useSessionMenu() { if (item.talk_type == 1) { options.push({ - icon: renderIcon(IdCard), + label: '好友信息', key: 'info' }) options.push({ - icon: renderIcon(EditTwo), + label: '修改备注', key: 'remark' }) } options.push({ - icon: renderIcon(item.is_top ? ArrowDown : ArrowUp), + label: item.is_top ? '取消置顶' : '会话置顶', key: 'top' }) options.push({ - icon: renderIcon(item.is_disturb ? Remind : CloseRemind), + label: item.is_disturb ? '关闭免打扰' : '开启免打扰', key: 'disturb' }) options.push({ - icon: renderIcon(Clear), + label: '移除会话', key: 'remove' }) if (item.talk_type == 1) { options.push({ - icon: renderIcon(Delete), + label: '删除好友', key: 'delete_contact' }) } else { options.push({ - icon: renderIcon(Logout), + label: '退出群聊', key: 'signout_group' }) diff --git a/src/store/modules/talk.ts b/src/store/modules/talk.ts index bdd7dfb..c2feae8 100644 --- a/src/store/modules/talk.ts +++ b/src/store/modules/talk.ts @@ -93,6 +93,7 @@ export const useTalkStore = defineStore('talk', { resp.then(({ code, data }) => { if (code == 200) { + this.items = data.items.map((item: any) => { const value = formatTalkItem(item) @@ -104,7 +105,6 @@ export const useTalkStore = defineStore('talk', { if (value.is_robot == 1) { value.is_online = 1 } - return value }) diff --git a/src/views/message/inner/IndexSider.vue b/src/views/message/inner/IndexSider.vue index 1fde2e7..8b59aa4 100644 --- a/src/views/message/inner/IndexSider.vue +++ b/src/views/message/inner/IndexSider.vue @@ -229,15 +229,22 @@ const state = reactive({ }) const items = computed((): ISession[] => { - if (searchKeyword.value.length === 0) { - return talkStore.talkItems + let filtered = talkStore.talkItems + + if (searchKeyword.value.length > 0) { + filtered = filtered.filter((item: ISession) => { + let keyword = item.remark || item.name + return keyword.toLowerCase().indexOf(searchKeyword.value.toLowerCase()) != -1 + }) } - return talkStore.talkItems.filter((item: ISession) => { - let keyword = item.remark || item.name + // 置顶和非置顶分组 + const topItems = filtered + .filter(item => item.is_top === 1) + .sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()) + const normalItems = filtered.filter(item => item.is_top !== 1) - return keyword.toLowerCase().indexOf(searchKeyword.value.toLowerCase()) != -1 - }) + return [...topItems, ...normalItems] }) watch( () => talkStore, diff --git a/src/views/message/inner/TalkItem.vue b/src/views/message/inner/TalkItem.vue index fb11c5a..fca0330 100644 --- a/src/views/message/inner/TalkItem.vue +++ b/src/views/message/inner/TalkItem.vue @@ -19,7 +19,7 @@ const labelColor=[