From dace1dd1f3069a739d24cc56d6b387655edb5641 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 6 Nov 2024 20:16:46 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=B7=B2=E8=AF=BB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/WebSocketDialog.php | 2 +- app/Models/WebSocketDialogUser.php | 2 ++ resources/assets/js/functions/common.js | 24 +++++++++++--- .../pages/manage/components/DialogWrapper.vue | 31 +++++++++++++++++-- .../pages/manage/components/ProjectPanel.vue | 2 +- resources/assets/js/store/state.js | 2 +- 6 files changed, 52 insertions(+), 11 deletions(-) diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 8169d5912..150adac32 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -230,7 +230,7 @@ class WebSocketDialog extends AbstractModel } // 会员数据处理 if (isset($data['user_at']) && !isset($data['user_ms'])) { - $time = Carbon::parse($fields['user_at']); + $time = Carbon::parse($data['user_at']); $data['user_at'] = $time->toDateTimeString('millisecond'); $data['user_ms'] = $time->valueOf(); } diff --git a/app/Models/WebSocketDialogUser.php b/app/Models/WebSocketDialogUser.php index a0ececa8f..ac80d3ff0 100644 --- a/app/Models/WebSocketDialogUser.php +++ b/app/Models/WebSocketDialogUser.php @@ -47,6 +47,8 @@ use Carbon\Carbon; */ class WebSocketDialogUser extends AbstractModel { + protected $dateFormat = 'Y-m-d H:i:s.u'; + /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ diff --git a/resources/assets/js/functions/common.js b/resources/assets/js/functions/common.js index 2c7bb9754..185df70c2 100755 --- a/resources/assets/js/functions/common.js +++ b/resources/assets/js/functions/common.js @@ -347,10 +347,12 @@ const timezone = require("dayjs/plugin/timezone"); * @returns {*} */ cloneJSON(myObj) { - if (typeof (myObj) !== 'object') return myObj; - if (myObj === null) return myObj; - // - return $A.jsonParse($A.jsonStringify(myObj)) + try { + return structuredClone(myObj); + } catch (e) { + if (typeof myObj !== 'object' || myObj === null) return myObj; + return $A.jsonParse($A.jsonStringify(myObj)) + } }, /** @@ -1255,7 +1257,19 @@ const timezone = require("dayjs/plugin/timezone"); return sliced.join('') + suffix; } return sliced.join(''); - } + }, + + /** + * 获取两个数组后面的交集 + * @param arr1 + * @param arr2 + * @returns {*} + */ + getLastSameElements(arr1, arr2) { + return arr1.slice(-(arr1.filter((item, index) => + item === arr2[arr2.length - arr1.length + index] + ).length)); + }, }); /** diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 667ffa156..2cec27be2 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -832,6 +832,7 @@ export default { scrollToBottomRefresh: false, // 滚动到底部重新获取消息 androidKeyboardVisible: false, // Android键盘是否可见 replyMsgAutoMention: false, // 允许回复消息后自动@ + waitUnreadData: {}, // 等待未读数据 } }, @@ -1215,7 +1216,7 @@ export default { dialogId: { handler(dialog_id, old_id) { - this.getDialogBase(dialog_id) + this.getDialogBase(dialog_id, old_id) // this.$store.dispatch('closeDialog', old_id) // @@ -1449,8 +1450,22 @@ export default { /** * 获取会话基本信息 * @param dialog_id + * @param old_id */ - getDialogBase(dialog_id) { + getDialogBase(dialog_id, old_id = null) { + if (old_id) { + const ens = [] + const ids = this.allMsgs.filter(item => item.read_at === null && item.userid != this.userId).map(item => item.id) + const enters = this.$refs.scroller?.$el.querySelectorAll('.item-enter') || [] + for (const enter of enters) { + const id = $A.runNum(enter.querySelector(".dialog-view")?.getAttribute('data-id')); + if (id && !ids.includes(id)) { + ids.push(id) + } + } + this.waitUnreadData[old_id] = $A.getLastSameElements(ids, ens) + } + if (!dialog_id) { return } @@ -1473,10 +1488,20 @@ export default { dialog_id, msg_id: this.msgId, msg_type: this.msgType, - }).then(_ => { + }).then(({data}) => { this.openId = dialog_id this.msgPrepared = true // + if (this.dialogId !== dialog_id) { + let unreadIds = this.waitUnreadData[dialog_id] || [] + if (unreadIds.length > 0) { + const ids = [...data.list.map(item => item.id)].reverse(); + $A.getLastSameElements(unreadIds, ids).forEach(id => { + this.$store.dispatch("dialogMsgRead", {id, dialog_id}) + }) + } + } + // setTimeout(_ => { this.onSearchMsgId() this.positionShow = this.readTimeout === null diff --git a/resources/assets/js/pages/manage/components/ProjectPanel.vue b/resources/assets/js/pages/manage/components/ProjectPanel.vue index d294e4694..d443b6192 100644 --- a/resources/assets/js/pages/manage/components/ProjectPanel.vue +++ b/resources/assets/js/pages/manage/components/ProjectPanel.vue @@ -675,7 +675,7 @@ export default { columnList() { const {projectId, cacheColumns, allTask} = this; - const list = cacheColumns.filter(({project_id}) => { + const list = $A.cloneJSON(cacheColumns).filter(({project_id}) => { return project_id == projectId }).sort((a, b) => { if (a.sort != b.sort) { diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js index dcb9d07e0..0efd13ebd 100644 --- a/resources/assets/js/store/state.js +++ b/resources/assets/js/store/state.js @@ -7,7 +7,7 @@ export default { clientId: "", // 缓存版本号(如果想升级后清除客户端缓存则修改此参数值) - cacheVersion: "v8", + cacheVersion: "v9", // 窗口是否激活 windowActive: true,