From b01a54437a26c504f0475ac035f9bd7ce27ce201 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 8 Jul 2025 10:41:41 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ProjectController.php | 29 ++- app/Models/ProjectTaskUser.php | 13 +- app/Models/ProjectUser.php | 13 +- .../js/pages/manage/components/ProjectLog.vue | 228 +++++++++++------- .../sass/pages/components/project-log.scss | 1 - 5 files changed, 189 insertions(+), 95 deletions(-) diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index b609b769b..d8b17a29b 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -3062,7 +3062,18 @@ class ProjectController extends AbstractController ]); // 更新标签 $project->addLog("修改标签", [ - 'change' => [$tag->name . '(' . $tag->color . ')', $data['name'] . '(' . $data['color'] . ')'] + 'change' => [ + [ + 'type' => 'tag', + 'name' => $tag->name, + 'color' => $tag->color + ], + [ + 'type' => 'tag', + 'name' => $data['name'], + 'color' => $data['color'] + ] + ], ]); $tag->update($data); }); @@ -3077,7 +3088,13 @@ class ProjectController extends AbstractController ])->exists()) { return Base::retError('标签已存在'); } - $project->addLog("添加标签: " . $data['name']); + $project->addLog("添加标签", [ + 'change' => [ + 'type' => 'tag', + 'name' => $name, + 'color' => $color + ] + ]); $tag = ProjectTag::create($data); } return Base::retSuccess('保存成功', $tag); @@ -3128,7 +3145,13 @@ class ProjectController extends AbstractController // 删除任务标签 ProjectTaskTag::where($tagWhere)->delete(); // 删除标签 - $project->addLog("删除标签: " . $tag->name); + $project->addLog("删除标签", [ + 'change' => [ + 'type' => 'tag', + 'name' => $tag->name, + 'color' => $tag->color + ], + ]); $tag->delete(); return Base::retSuccess('删除成功'); }); diff --git a/app/Models/ProjectTaskUser.php b/app/Models/ProjectTaskUser.php index a7afb9de4..ce9af3a8c 100644 --- a/app/Models/ProjectTaskUser.php +++ b/app/Models/ProjectTaskUser.php @@ -68,7 +68,18 @@ class ProjectTaskUser extends AbstractModel $item->save(); } if ($item->projectTask) { - $item->projectTask->addLog("移交{任务}身份", ['userid' => [$originalUserid, ' => ', $newUserid]], 0, 1); + $item->projectTask->addLog("移交{任务}身份", [ + 'change' => [ + [ + 'type' => 'user', + 'data' => $originalUserid, + ], + [ + 'type' => 'user', + 'data' => $newUserid, + ] + ], + ], 0, 1); if (!in_array($item->task_pid, $tastIds)) { $tastIds[] = $item->task_pid; $item->projectTask->syncDialogUser(); diff --git a/app/Models/ProjectUser.php b/app/Models/ProjectUser.php index 92c4f569f..cc446cf3b 100644 --- a/app/Models/ProjectUser.php +++ b/app/Models/ProjectUser.php @@ -74,7 +74,18 @@ class ProjectUser extends AbstractModel $item->project->name = "【{$name}】{$item->project->name}"; $item->project->save(); } - $item->project->addLog("移交项目身份", ['userid' => [$originalUserid, ' => ', $newUserid]]); + $item->project->addLog("移交项目身份", [ + 'change' => [ + [ + 'type' => 'user', + 'data' => $originalUserid + ], + [ + 'type' => 'user', + 'data' => $newUserid + ], + ], + ]); $item->project->syncDialogUser(); $projectIds[] = $item->project_id; } diff --git a/resources/assets/js/pages/manage/components/ProjectLog.vue b/resources/assets/js/pages/manage/components/ProjectLog.vue index 78d6ed6b2..83ec76a88 100644 --- a/resources/assets/js/pages/manage/components/ProjectLog.vue +++ b/resources/assets/js/pages/manage/components/ProjectLog.vue @@ -176,104 +176,154 @@ export default { /** * 日志详情 * @param h + * @param id * @param detail * @param record * @returns {*[]} */ - logDetail(h, {detail, record}) { - let vNode = [h('span', detail)]; - if ($A.isJson(record)) { - if ($A.isArray(record.change)) { - let [before, now] = record.change - vNode.push(h('span', ': ')) - if (before && before != now) { - vNode.push(h('span', {class:'change-value'}, `${before || '-'}`)) - vNode.push(h('span', ' => ')) - vNode.push(h('span', {class:'change-value'}, `${now || '-'}`)) - } else { - vNode.push(h('span', {class:'change-value'}, now || '-')) - } - } - if ($A.isArray(record.tags)) { - vNode.push(h('span', { - class: 'change-tags' - }, [ - h('TaskTag', { - props: { - tags: record.tags + logDetail(h, {id, detail, record}) { + const nodes = (nodeData) => { + const {type, data} = nodeData; + switch (type) { + case 'tag': + return h('span', { + class: 'change-tags' + }, [ + h('TaskTag', { + props: { + tags: [nodeData] + } + }) + ]) + + case 'tags': + return h('span', { + class: 'change-tags' + }, [ + h('TaskTag', { + props: { + tags: data + } + }) + ]) + + case 'link': + const {title, url} = data; + return h('a', { + attrs: { + href: $A.mainUrl(url), + target: '_blank' + }, + on: { + click: e => { + const path = `/${url}` + if (this.$Electron) { + e.preventDefault() + this.$store.dispatch('openChildWindow', { + name: `project-log-${id}`, + path: path, + force: false, + config: { + title: this.$L(title), + parent: null, + width: Math.min(window.screen.availWidth, 1440), + height: Math.min(window.screen.availHeight, 900), + }, + }); + } else if (this.$isEEUIApp) { + e.preventDefault() + this.$store.dispatch('openAppChildPage', { + pageType: 'app', + pageTitle: this.$L(title), + url: 'web.js', + params: { + url: $A.urlReplaceHash(path) + }, + }) + } + } + } + }, this.$L(title)) + + case 'user': + case 'userid': + const userNode = []; + const userids = $A.isArray(data) ? data : [data]; + userids.some(userid => { + if (/^\d+$/.test(userid)) { + userNode.push(h('UserAvatar', { + props: { + size: 18, + userid + } + })) + } else { + userNode.push(h('span', userid)) } }) - ])) - } - if ($A.isJson(record.link)) { - const {title, url} = record.link - vNode.push(h('span', ': ')) - vNode.push(h('a', { - attrs: { - href: url, - target: '_blank' - }, - on: { - click: e => { - e.preventDefault() - const path = `/${url}` - if (this.$Electron) { - this.$store.dispatch('openChildWindow', { - name: `project-log-${record.id}`, - path: path, - force: false, - config: { - title: this.$L(title), - parent: null, - width: Math.min(window.screen.availWidth, 1440), - height: Math.min(window.screen.availHeight, 900), - }, - }); - } else if (this.$isEEUIApp) { - this.$store.dispatch('openAppChildPage', { - pageType: 'app', - pageTitle: this.$L(title), - url: 'web.js', - params: { - url: $A.urlReplaceHash(path) - }, - }) - } else { - window.open($A.mainUrl(path.substring(1))) - } - } + if (userNode.length > 0) { + return h('div', { + class: 'detail-user' + }, [ + h('div', { + class: 'detail-user-wrap' + }, userNode) + ]) } - }, this.$L(title))) - } - if (record.userid) { - let userids = $A.isArray(record.userid) ? record.userid : [record.userid] - let userNode = []; - userids.some(userid => { - if (/^\d+$/.test(userid)) { - userNode.push(h('UserAvatar', { - props: { - size: 18, - userid - } - })) - } else { - userNode.push(h('span', userid)) - } - }) - if (userNode.length > 0) { - vNode.push(h('div', { - class: 'detail-user' - }, [ - h('div', { - class: 'detail-user-wrap' - }, userNode) - ])) - } + return null + + case 'value': + return h('span', {class: 'change-value'}, data || '-') + + default: + return null } } - return h('span', { - class: 'log-text' - }, vNode) + const vNode = [h('span', detail)]; + if ($A.isJson(record)) { + let changes = []; + if ($A.isArray(record.tags)) { + changes.push({ + 'type': 'tags', + 'data': record.tags + }) + } else if ($A.isJson(record.link)) { + changes.push({ + 'type': 'link', + 'data': record.link + }) + } else if (record.userid) { + changes.push({ + 'type': 'user', + 'data': record.userid + }) + } else if (record.change) { + if ($A.isArray(record.change)) { + changes.push(...record.change.map(item => { + if ($A.isJson(item)) { + return item + } + return { + type: 'value', + data: item + } + })); + } else if ($A.isJson(record.change)) { + changes.push(record.change); + } + } + if (changes.length > 0) { + const connector = changes.length > 2 ? ', ' : ' => ' + vNode.push(h('span', ': ')) + changes.forEach((change, index) => { + if (index > 0) { + vNode.push(h('span', connector)) + } + vNode.push(nodes(change)) + }) + } + } + return h('span', { class: 'log-text' }, vNode) }, /** diff --git a/resources/assets/sass/pages/components/project-log.scss b/resources/assets/sass/pages/components/project-log.scss index e985f7c3e..11d457ab7 100644 --- a/resources/assets/sass/pages/components/project-log.scss +++ b/resources/assets/sass/pages/components/project-log.scss @@ -146,7 +146,6 @@ .change-tags { display: inline-block; - margin-left: 6px; .tags-box { gap: 6px; > li {