From d9f41e563e188e1b16c2fec1443c100b9a5583cc Mon Sep 17 00:00:00 2001
From: Phoenix <64720302+Concur-max@users.noreply.github.com>
Date: Thu, 29 May 2025 16:59:59 +0800
Subject: [PATCH] =?UTF-8?q?feat(editor):=20=E6=B7=BB=E5=8A=A0=E8=87=AA?=
=?UTF-8?q?=E5=AE=9A=E4=B9=89=E7=BC=96=E8=BE=91=E5=99=A8=E7=BB=84=E4=BB=B6?=
=?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 新增 CustomEditor.vue 组件,提供富文本编辑功能,支持@提及、表情、图片和文件上传
2. 优化消息处理逻辑,增加空值检查和错误处理
3. 替换 PanelFooter.vue 中的默认编辑器为自定义编辑器
4. 更新 util.ts 和 talk.ts 中的相关逻辑,增强健壮性
自定义编辑器实现了更丰富的交互功能,包括:
- 支持@提及用户并显示选择列表
- 支持插入表情符号和图片
- 优化文件上传处理流程
- 增强粘贴和键盘事件处理
---
src/components/editor/CustomEditor.vue | 1078 +++++++++++++++++
src/components/editor/util.ts | 2 +-
src/store/modules/talk.ts | 6 +-
src/utils/auth.js | 2 +-
src/views/message/inner/panel/PanelFooter.vue | 10 +-
5 files changed, 1091 insertions(+), 7 deletions(-)
create mode 100644 src/components/editor/CustomEditor.vue
diff --git a/src/components/editor/CustomEditor.vue b/src/components/editor/CustomEditor.vue
new file mode 100644
index 0000000..1cb657b
--- /dev/null
+++ b/src/components/editor/CustomEditor.vue
@@ -0,0 +1,1078 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+ {{ member.nickname }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/editor/util.ts b/src/components/editor/util.ts
index bb569b4..f07b17a 100644
--- a/src/components/editor/util.ts
+++ b/src/components/editor/util.ts
@@ -103,7 +103,7 @@ export function deltaToMessage(delta: Delta): AnalysisResp {
}
if (insert && insert.quote) {
- resp.quoteId = insert.quote.id
+ resp.quoteId = insert.quote.id||''
continue
}
}
diff --git a/src/store/modules/talk.ts b/src/store/modules/talk.ts
index c2feae8..71dd551 100644
--- a/src/store/modules/talk.ts
+++ b/src/store/modules/talk.ts
@@ -99,7 +99,11 @@ export const useTalkStore = defineStore('talk', {
const draft = useEditorDraftStore().items[value.index_name]
if (draft) {
- value.draft_text = JSON.parse(draft).text || ''
+ try {
+ value.draft_text = JSON.parse(draft).text || ''
+ } catch (e) {
+ value.draft_text = draft
+ }
}
if (value.is_robot == 1) {
diff --git a/src/utils/auth.js b/src/utils/auth.js
index 9a5803a..4ee6d5e 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'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d227de310c4e6f5d7ff11a9e1ea73aba3f6c749f75a50a2aeaed07b14bc0d8b1db6428caf891f0a0b0c84a49697f4a4e7c8b87d972340ecbf02ddbc4d4f1e51b057c822f8351524e19d52a3ec5ce8c83e2f'
+ return JSON.parse(localStorage.getItem('token'))||'46d71a72d8d845ad7ed23eba9bdde260e635407190c2ce1bf7fd22088e41682ea07773ec65cae8946d2003f264d55961f96e0fc5da10eb96d3a348c1664e9644ce2108c311309f398ae8ea1b8200bfd490e5cb6e8c52c9e5d493cbabb163368f8351420451a631dbfa749829ee4cda49b77b5ed2d3dced5d0f2b7dd9ee76ba5465c84a17c23af040cd92b6b2a4ea48befbb5c729dcdad0a9c9668befe84074cc24f78899c1d947f8e7f94c7eda5325b8ed698df729e76febb98549ef3482ae942fb4f4a1c92d21836fa784728f0c5483aab2760a991b6b36e6b10c84f840a6433a6ecc31dee36e8f1c6158818bc89d22cfdbfc3bc1d58c0fc81df3825ac0a76436ffc05a48efbb059bc6ec71c3405b3d02bbfd64af6e95f2d65bb8e21b5f94aa2de31ba7d103d900afbe3c668a78f089238c92090ce94a0cbf04aeda28ec697d'
}
/**
diff --git a/src/views/message/inner/panel/PanelFooter.vue b/src/views/message/inner/panel/PanelFooter.vue
index a8e5c52..25cf2d5 100644
--- a/src/views/message/inner/panel/PanelFooter.vue
+++ b/src/views/message/inner/panel/PanelFooter.vue
@@ -12,7 +12,8 @@ import ws from '@/connect'
import { ServePublishMessage, ServeSendVote } from '@/api/chat'
import { throttle, getVideoImage } from '@/utils/common'
import { parseTime } from '@/utils/datetime'
-import Editor from '@/components/editor/Editor.vue'
+// import Editor from '@/components/editor/Editor.vue'
+import CustomEditor from '@/components/editor/CustomEditor.vue'
import MultiSelectFooter from './MultiSelectFooter.vue'
import HistoryRecord from '@/components/talk/HistoryRecord.vue'
import {scrollToBottom} from '@/utils/dom.ts'
@@ -80,7 +81,7 @@ const onSendTextEvent = throttle((value: any) => {
let message = {
type: 'text',
content: data.items[0].content,
- quote_id: data.quoteId,
+ quote_id: data.quoteId ||'',
mentions: data.mentionUids
}
@@ -233,7 +234,7 @@ const onSendEmoticonEvent = ({ data, callBack }) => {
const onSendMixedEvent = ({ data, callBack }) => {
let message = {
type: 'mixed',
- quote_id: data.quoteId,
+ quote_id: data.quoteId ||'',
items: data.items
}
@@ -291,7 +292,8 @@ onMounted(() => {