diff --git a/env/.env.test b/env/.env.test index e7f905e..43930b6 100644 --- a/env/.env.test +++ b/env/.env.test @@ -8,4 +8,5 @@ VUE_APP_PREVIEW=false VITE_BASE_API=http://114.218.158.24:8503 VITE_SOCKET_API=ws://114.218.158.24:8504 VITE_EPR_BASEURL=http://114.218.158.24:9020 +VITE_PAGE_URL=http://172.16.100.93:9032 VUE_APP_WEBSITE_NAME="" \ No newline at end of file diff --git a/src/components/editor/Editor.vue b/src/components/editor/Editor.vue index fef3e47..5bc1b8e 100644 --- a/src/components/editor/Editor.vue +++ b/src/components/editor/Editor.vue @@ -363,22 +363,9 @@ async function onUploadFile(e: any) { console.log("文件类型"+file.type) if (file.type.indexOf('image/') === 0) { console.log("进入图片") - // 处理图片文件 - const quill = getQuill() - let index = getQuillSelectionIndex() - - // 删除编辑器中多余的换行符 - if (index == 1 && quill.getLength() == 1 && quill.getText(0, 1) == '\n') { - quill.deleteText(0, 1) - index = 0 - } - - // 上传图片并插入到编辑器中 - let src = await onUploadImage(file) - if (src) { - quill.insertEmbed(index, 'image', src) - quill.setSelection(index + 1) - } + // 处理图片文件 - 立即显示临时消息,然后上传 + let fn = emitCall('image_event', file, () => {}) + emit('editor-event', fn) return } @@ -437,8 +424,7 @@ function onClipboardMatcher(node: any, Delta) { function onSendMessage() { var delta = getQuill().getContents() let data = deltaToMessage(delta) // 转换Delta为消息格式 - - if (data.items.length === 0) { + if (data.items.length === 0||!data.items[0].content.trim()) { return // 没有内容不发送 } diff --git a/src/components/talk/message/FileMessage.vue b/src/components/talk/message/FileMessage.vue index 9653726..8129e4e 100644 --- a/src/components/talk/message/FileMessage.vue +++ b/src/components/talk/message/FileMessage.vue @@ -49,7 +49,7 @@ const PPT_EXTENSIONS = ['PPT', 'PPTX', 'PPS', 'PPSX'] // 获取文件类型信息 const fileInfo = computed(() => { - const extension = getFileExtension(props.extra.name) + const extension = getFileExtension(props.extra.path) if (EXCEL_EXTENSIONS.includes(extension)) { return fileTypes.EXCEL } @@ -63,8 +63,8 @@ const fileInfo = computed(() => { }) // 获取文件扩展名 -function getFileExtension(filename) { - const parts = filename.split('.') +function getFileExtension(filepath) { + const parts = filepath.split('.') return parts.length > 1 ? parts.pop().toUpperCase() : '' } @@ -88,7 +88,7 @@ const strokeDashoffset = computed(() => const handleClick = () => { if(!props.extra.is_uploading){ window.open( - `${window.location.origin}/office?url=${props.extra.path}`, + `${import.meta.env.VITE_PAGE_URL}/office?url=${props.extra.path}`, '_blank', 'width=1200,height=900,left=200,top=200,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=no,status=no' ); diff --git a/src/components/talk/message/ImageMessage.vue b/src/components/talk/message/ImageMessage.vue index 389c220..588a3a8 100644 --- a/src/components/talk/message/ImageMessage.vue +++ b/src/components/talk/message/ImageMessage.vue @@ -1,9 +1,9 @@ @@ -737,11 +356,6 @@ const loadMoreReadListDetail = () => { v-for="(item, index) in records" :key="item.msg_id" :id="item.msg_id" - :data-msgid="item.msg_id" - :data-msgtype="item.msg_type" - :data-userid="item.user_id" - :data-talktype="props?.talk_type" - :data-receiverid="props?.receiver_id" > @@ -775,11 +389,7 @@ const loadMoreReadListDetail = () => { > @@ -807,8 +417,10 @@ const loadMoreReadListDetail = () => { {{ parseTime(item.created_at, '{y}/{m}/{d} {h}:{i}') }} --> - {{ item.nickname }} + {{ item.nickname }} {{ parseTime(item.created_at, '{y}/{m}/{d} {h}:{i}') }} @@ -867,72 +479,6 @@ const loadMoreReadListDetail = () => { {{ item.extra?.reply?.content }} - - - - - - {{ - item.read_total_num > 0 ? '已读' : '未读' - }} - - 已读 ({{ item?.read_total_num || 0 }}/{{ - props.num - 1 > 0 ? props.num - 1 : 0 - }}) - - - - - - {{ `未读(${props.num - 1 - (item.read_total_num || 0) || 0})` }} - - - {{ `已读(${item.read_total_num || 0})` }} - - - - - - - - {{ - talkReadDetailItem.nickName - }} - {{ - talkReadDetailItem.jobNum - }} - - - - - - - @@ -1131,18 +677,6 @@ const loadMoreReadListDetail = () => { } } - .talk_read_num { - text-align: right; - color: #7a58de; - font-size: 12px; - font-weight: 400; - line-height: 17px; - margin: 5px 0 0; - span { - cursor: pointer; - } - } - &:hover { .talk-title { opacity: 1; @@ -1191,31 +725,4 @@ const loadMoreReadListDetail = () => { } } } - -.talk-read-list-detail { - width: 341px; - padding: 0 14px; - - .talk-read-list { - .talk-read-list-item { - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - gap: 10px; - padding: 10px 0; - border-bottom: 1px solid #f1f1f1; - - .talk-read-list-item-info { - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: center; - - span { - } - } - } - } -} diff --git a/src/views/message/inner/panel/PanelFooter.vue b/src/views/message/inner/panel/PanelFooter.vue index a481387..dc5f8ad 100644 --- a/src/views/message/inner/panel/PanelFooter.vue +++ b/src/views/message/inner/panel/PanelFooter.vue @@ -94,8 +94,60 @@ const onSendTextEvent = throttle((value: any) => { }, 1000) // 发送图片消息 -const onSendImageEvent = ({ data, callBack }) => { - onSendMessage({ type: 'image', ...data }, callBack) +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]) + + } + ) } // 发送视频消息 diff --git a/vite.config.ts b/vite.config.ts index 715bc77..83a792e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -46,9 +46,9 @@ export default defineConfig(({ mode }) => { vueJsx({}), compressPlugin(), UnoCSS(), - // vueDevTools({ - // launchEditor: 'trae', - // }) + vueDevTools({ + launchEditor: 'trae', + }) ], define: { __APP_ENV__: env.APP_ENV