diff --git a/package.json b/package.json index 8c5366b..0b8bf58 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@kangc/v-md-editor": "^2.3.18", "@onlyoffice/document-editor-vue": "^1.5.0", "@vicons/fluent": "^0.13.0", + "@vicons/ionicons4": "^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 168cebb..e186607 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@vicons/fluent': specifier: ^0.13.0 version: 0.13.0 + '@vicons/ionicons4': + specifier: ^0.13.0 + version: 0.13.0 '@vicons/ionicons5': specifier: ^0.13.0 version: 0.13.0 @@ -1002,6 +1005,9 @@ packages: '@vicons/fluent@0.13.0': resolution: {integrity: sha512-bYGZsOE3qzvm3Cm43e7tybgGlr5ZUpYqtRZq0g0Tfupe8jIzLolpvQLNUt1zS8Mgt6goTbUk5YH7Fkv16jkykg==} + '@vicons/ionicons4@0.13.0': + resolution: {integrity: sha512-5WHIl/4R5a4i9GONa+hIQWxg/WczrbsCdqxawHZvdd3drsEr+Q3yzlfS+NNRO4WS3uDW2uWLCwoW+yp5TgcKeQ==} + '@vicons/ionicons5@0.13.0': resolution: {integrity: sha512-zvZKBPjEXKN7AXNo2Na2uy+nvuv6SP4KAMQxpKL2vfHMj0fSvuw7JZcOPCjQC3e7ayssKnaoFVAhbYcW6v41qQ==} @@ -4411,6 +4417,8 @@ snapshots: '@vicons/fluent@0.13.0': {} + '@vicons/ionicons4@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/components/editor/CustomEditor.vue b/src/components/editor/CustomEditor.vue new file mode 100644 index 0000000..b22e712 --- /dev/null +++ b/src/components/editor/CustomEditor.vue @@ -0,0 +1,1860 @@ + + + + + \ No newline at end of file diff --git a/src/components/editor/MeEditorEmoticon.vue b/src/components/editor/MeEditorEmoticon.vue index a88e65c..4cd9c3e 100644 --- a/src/components/editor/MeEditorEmoticon.vue +++ b/src/components/editor/MeEditorEmoticon.vue @@ -186,16 +186,20 @@ const onSendEmoticon = (type: any, value: any, img = '') => { flex-wrap: wrap; .option{ - margin: 7px; + padding: 7px; + border-radius: 4px; + &:hover { + background-color: #F2F2F2; + } :deep(.emoji){ height: 22px; width: 22px; user-select: none; transition: all 0.5s; - &:hover { - transform: scale(1.5); - } + // &:hover { + // transform: scale(1.5); + // } } } } diff --git a/src/components/talk/message/FileMessage.vue b/src/components/talk/message/FileMessage.vue index 8129e4e..de5004e 100644 --- a/src/components/talk/message/FileMessage.vue +++ b/src/components/talk/message/FileMessage.vue @@ -64,8 +64,8 @@ const fileInfo = computed(() => { // 获取文件扩展名 function getFileExtension(filepath) { - const parts = filepath.split('.') - return parts.length > 1 ? parts.pop().toUpperCase() : '' + const parts = filepath?.split('.') + return parts?.length > 1 ? parts?.pop()?.toUpperCase() : '' } // 切换播放状态 diff --git a/src/constant/event-bus.ts b/src/constant/event-bus.ts index a437264..3abbb99 100644 --- a/src/constant/event-bus.ts +++ b/src/constant/event-bus.ts @@ -5,5 +5,6 @@ export const enum ContactConst { export const enum EditorConst { Mention = 'editor:mention', Quote = 'editor:quote', - Edit = 'editor:edit' + Edit = 'editor:edit', + Clear = 'editor:clear' } diff --git a/src/hooks/useTalkRecord.ts b/src/hooks/useTalkRecord.ts index 4accf93..027c93f 100644 --- a/src/hooks/useTalkRecord.ts +++ b/src/hooks/useTalkRecord.ts @@ -190,8 +190,6 @@ export const useTalkRecord = (uid: number) => { loadConfig.receiver_id = params.receiver_id loadConfig.talk_type = params.talk_type - console.error('onLoad', params, options) - // 新增:支持指定消息定位模式,参数以传入为准合并 if (options?.specifiedMsg?.cursor !== undefined) { loadConfig.specialParams = { ...options.specifiedMsg } // 记录特殊参数,供分页加载用 diff --git a/src/utils/auth.js b/src/utils/auth.js index f4f176c..2ec121f 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -18,7 +18,7 @@ export function isLoggedIn() { */ export function getAccessToken() { // return storage.get(AccessToken) || '' - return JSON.parse(localStorage.getItem('token'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d22726726265e9af0db370a54ea5ee002b43662d571b84c8468ac15330f79503a5cd5e72282d8bee92749b1a3c1b7fd87ae70b64b90e437e84c1b558c64a35e181b2ecf5db3007680c3607eac1edee7f59d' + return JSON.parse(localStorage.getItem('token'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d22c9c2f9b60a57573e8b08cdf47105e1ba85550c21fa55526e8a00bf316c623eb67abf749622c48beab908d61d3db7b22ed3eb6aa8a08c77680ad4d8a3458c1e72f97ba2b8480674df77f0501a34e82b58' } /** diff --git a/src/views/message/inner/panel/PanelContent.vue b/src/views/message/inner/panel/PanelContent.vue index 5cb1cc9..b4d2df7 100644 --- a/src/views/message/inner/panel/PanelContent.vue +++ b/src/views/message/inner/panel/PanelContent.vue @@ -289,7 +289,6 @@ watch( async (newProps) => { await nextTick() let specialParams = undefined - console.error(newProps, 'newProps') if (newProps.specifiedMsg) { try { const parsed = JSON.parse(decodeURIComponent(newProps.specifiedMsg)) diff --git a/src/views/message/inner/panel/PanelFooter.vue b/src/views/message/inner/panel/PanelFooter.vue index dc5f8ad..e1a8abb 100644 --- a/src/views/message/inner/panel/PanelFooter.vue +++ b/src/views/message/inner/panel/PanelFooter.vue @@ -16,6 +16,7 @@ import Editor from '@/components/editor/Editor.vue' import MultiSelectFooter from './MultiSelectFooter.vue' import HistoryRecord from '@/components/talk/HistoryRecord.vue' import {scrollToBottom} from '@/utils/dom.ts' +import CustomEditor from '@/components/editor/CustomEditor.vue' const userStore = useUserStore() const talkStore = useTalkStore() const editorStore = useEditorStore() @@ -60,11 +61,11 @@ const onSendMessage = (data = {}, callBack: any) => { } ServePublishMessage(message) - .then(({ code, message }) => { + .then(({ code, message, msg }) => { if (code == 200) { callBack(true) } else { - window['$message'].warning(message) + window['$message'].warning(message || msg) } }) .catch(() => { @@ -94,65 +95,13 @@ const onSendTextEvent = throttle((value: any) => { }, 1000) // 发送图片消息 -const onSendImageEvent = ({ data }) => { - console.log('onSendImageEvent') - - // 先创建一个带有上传ID的临时消息对象,用于显示进度 - const uploadId = `image-${Date.now()}-${Math.floor(Math.random() * 1000)}` - - // 创建本地预览URL - const previewUrl = URL.createObjectURL(data) - - // 创建临时消息记录 - const tempMessage = { - msg_id: uploadId, - sequence: Date.now(), - talk_type: props.talk_type, - msg_type: 3, // 图片消息类型 - user_id: props.uid, - receiver_id: props.receiver_id, - is_revoke: 0, - is_mark: 0, - is_read: 1, - content: '', - created_at: parseTime(new Date(), '{y}-{m}-{d} {h}:{i}'), - extra: { - url: previewUrl, // 使用本地预览URL - size: data.size, - is_uploading: true, - upload_id: uploadId, - percentage: 0 - }, - isCheck: false, - send_status: 1, - float: 'right' // 我发送的消息显示在右侧 - } - - // 直接添加到对话记录中 - dialogueStore.addDialogueRecord(tempMessage) - nextTick(()=>{ - scrollToBottom() - }) - uploadsStore.initUploadFile( - data, - props.talk_type, - props.receiver_id, - uploadId, - async (percentage) => { - dialogueStore.updateUploadProgress(uploadId, percentage) - }, - async () => { - // 清理本地预览URL - URL.revokeObjectURL(previewUrl) - dialogueStore.batchDelDialogueRecord([uploadId]) - - } - ) +const onSendImageEvent = ({ data, callBack }) => { + onSendMessage({ type: 'image', ...data }, callBack) } // 发送视频消息 const onSendVideoEvent = async ({ data }) => { - console.log('onSendVideoEvent') + // 获取视频首帧作为封面图 // let resp = await getVideoImage(data) @@ -217,7 +166,6 @@ const onSendFileEvent = ({ data }) => { return window['$message'].warning('上传文件不能超过100M!') } const clientUploadId = `file-${Date.now()}-${Math.floor(Math.random() * 1000)}` - const tempMessage = { msg_id: clientUploadId, sequence: Date.now(), @@ -233,6 +181,7 @@ const onSendFileEvent = ({ data }) => { extra: { name: data.name, url: '', + path:data.name, size: data.size, is_uploading: true, upload_id: clientUploadId, @@ -342,7 +291,8 @@ onMounted(() => {