From de63fcffff909999a4bd122c2c3b71cd9e456bb8 Mon Sep 17 00:00:00 2001 From: Qiufeng Date: Wed, 19 Aug 2026 07:26:48 +0800 Subject: [PATCH] feat: show system update history as timeline --- README.md | 18 +- deploy/env.production.example | 2 +- frontend/e2e/system-update.e2e.ts | 15 +- .../src/pages/governance/SystemUpdatePage.vue | 563 ++++++++++++++++-- 4 files changed, 549 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 5f1f8a8..2f0d07b 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ PostgreSQL 18 兼容工作继续冻结。 先在宝塔面板停止并删除当前错误的 Java 项目,再执行: ```bash -curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.44/install.sh | sudo env KAIDI_APP_PORT=18080 bash +curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.45/install.sh | sudo env KAIDI_APP_PORT=18080 bash ``` 该命令只安装程序运行所需的 systemd 单元,自动创建 `kaidi` 用户并检测现有 Java 17(包括 @@ -96,7 +96,7 @@ curl -fsSL https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-previe 随后执行一键清理: ```bash -curl -fsSL 'https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.44/purge.sh' | sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION bash +curl -fsSL 'https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.45/purge.sh' | sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION bash ``` 上面是一条完整命令:脚本通过管道直接交给 root 执行,不创建临时安装文件,避免终端自动换行导致 `-o` 参数丢失。 @@ -117,9 +117,9 @@ Spring Boot 项目。数据库、JDK、Nginx 和宝塔本身都由运维人员 下载地址: -`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.44/kaidi-finance-1.0.0-preview.44.tar.gz` +`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.45/kaidi-finance-1.0.0-preview.45.tar.gz` -校验文件:`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.44/SHA256SUMS` +校验文件:`https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.45/SHA256SUMS` 服务器要求:Linux、Java 17(宝塔项目选择 JDK 17)、可访问外部 MySQL 8.4.x;**systemd 一键安装**还需要 systemd/systemd-analyze,**宝塔手动部署**不要求 systemd。32 位 Linux 需要宿主机 @@ -136,7 +136,7 @@ systemd/systemd-analyze,**宝塔手动部署**不要求 systemd。32 位 Linux 必须直接位于 `RELEASE_ROOT`,不能再嵌套一层目录。 ```bash -VERSION=1.0.0-preview.44 +VERSION=1.0.0-preview.45 APP_ROOT=/www/wwwroot/kaidi RELEASE_ROOT="$APP_ROOT/releases/$VERSION" sudo install -d -m 0755 "$RELEASE_ROOT" @@ -245,7 +245,7 @@ MySQL 8.4;提前准备外部 MySQL,完成上述向导即可。systemd 在线 `KAIDI_PURGE_DELETE_BACKUP=true`,实现本地受管文件和恢复包一并清除: ```bash -curl -fsSL 'https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.44/purge.sh' | sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION KAIDI_PURGE_DELETE_BACKUP=true bash +curl -fsSL 'https://git.awaioi.com/ERP-Team/kaidi/releases/download/v1.0.0-preview.45/purge.sh' | sudo env KAIDI_PURGE_CONFIRM=DELETE_LOCAL_KAIDI_INSTALLATION KAIDI_PURGE_DELETE_BACKUP=true bash ``` 执行前先在宝塔停止并删除 `kaidi-finance` Java 项目;宝塔面板元数据属于外部资源,必须由面板先停用, @@ -271,8 +271,8 @@ Actions 页面显示 “No matching online runner”,先启动并注册该标 Preview 属性由 SemVer 版本名表达。之后推送 tag 即会构建、测试、签名并发布: ```bash -git tag v1.0.0-preview.44 -git push origin v1.0.0-preview.44 +git tag v1.0.0-preview.45 +git push origin v1.0.0-preview.45 ``` 在线更新仍使用独立的 TDesign 页面:系统管理员进入“系统治理 → 系统更新”。更新源由 root 在 @@ -324,7 +324,7 @@ cat /var/lib/kaidi-update/status.json ```bash KAIDI_RELEASE_SIGNING_KEY=/secure/release-signing-private.pem \ KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \ - ./scripts/package-release.sh 1.0.0-preview.44 + ./scripts/package-release.sh 1.0.0-preview.45 KAIDI_TRUSTED_RELEASE_PUBLIC_KEY_SHA256=807c6aec1dc3f7ce494db16aa9d763c66f292033c38f328afd0390d2715a8cd9 \ ./scripts/verify-release.sh dist/release ``` diff --git a/deploy/env.production.example b/deploy/env.production.example index 5fe38c8..36ff34d 100644 --- a/deploy/env.production.example +++ b/deploy/env.production.example @@ -15,7 +15,7 @@ FILE_SCANNER_ENABLED=true FINANCE_BOOTSTRAP_ENABLED=false FINANCE_BOOTSTRAP_PASSWORD= -APP_VERSION=1.0.0-preview.44 +APP_VERSION=1.0.0-preview.45 UPDATE_CURRENT_VERSION_FILE=/opt/kaidi/current/VERSION FINANCE_UPDATE_ENABLED=true # Use either a stable direct asset base URL or the public Gitea latest-release API. diff --git a/frontend/e2e/system-update.e2e.ts b/frontend/e2e/system-update.e2e.ts index aa8ff0b..81fa892 100644 --- a/frontend/e2e/system-update.e2e.ts +++ b/frontend/e2e/system-update.e2e.ts @@ -138,6 +138,7 @@ async function installFixture( beforeJson: null, afterJson: JSON.stringify({ targetVersion, + ...(actionCode === 'SYSTEM_UPDATE_CHECK' ? { releaseNotes: 'Preview update' } : {}), ...(actionCode === 'SYSTEM_UPDATE_SUCCEEDED' ? { state: 'SUCCEEDED' } : {}), }), occurredAt: '2026-08-16T00:02:00Z', @@ -415,9 +416,17 @@ test('successful installation starts the ten-second automatic refresh countdown' timeout: 5_000, }); const historyPanel = page.locator('.history-panel'); - const completedRow = historyPanel.locator('tr').filter({ hasText: '更新完成' }); - await expect(completedRow).toContainText('1.0.0-preview.2'); - await expect(completedRow).toContainText('新版本已通过健康检查'); + const timelineItem = historyPanel.locator('.update-timeline__item[data-version="1.0.0-preview.2"]'); + await expect(timelineItem).toHaveCount(1); + await expect(timelineItem).toContainText('更新完成'); + await expect(timelineItem).toContainText('新版本已通过健康检查'); + await expect(timelineItem).toContainText('Preview update'); + await timelineItem.getByRole('button', { name: '查看完整记录', exact: true }).click(); + const historyDialog = page.getByRole('dialog', { name: '更新日志详情' }); + await expect(historyDialog).toContainText('获取版本'); + await expect(historyDialog).toContainText('下载更新包'); + await expect(historyDialog).toContainText('立即更新并重启'); + await expect(historyDialog).toContainText('更新完成'); }); test('reloading during installation resumes polling and starts the refresh countdown', async ({ page }) => { diff --git a/frontend/src/pages/governance/SystemUpdatePage.vue b/frontend/src/pages/governance/SystemUpdatePage.vue index 9e7254e..b8beb69 100644 --- a/frontend/src/pages/governance/SystemUpdatePage.vue +++ b/frontend/src/pages/governance/SystemUpdatePage.vue @@ -111,9 +111,9 @@

历史更新记录

-

记录版本获取、下载、重启安装和最终执行结果。

+

按版本汇总获取、下载、重启安装和最终执行结果。

- 最近 {{ historyRows.length }} 条 + 最近 {{ historyTimeline.length }} 个版本 · {{ historyRows.length }} 条记录
@@ -122,23 +122,65 @@ 重新加载 - - - - - - - +
+ +
+
+
+ +
+
+
+ {{ item.version }} + {{ formatDateTime(item.occurredAt) }} · {{ item.username || '系统' }} +
+ {{ resultLabel(item.resultCode) }} +
+ +
+ 执行流程 + {{ item.operations.join(' · ') }} + {{ item.steps.length }} 条记录 +
+

{{ item.reason || '已记录本次版本更新操作。' }}

+ +
+ 版本说明 +

{{ item.releaseNotes }}

+
+ +
+
+ +
+
+ {{ actionLabel(step.row.actionCode) }} + + {{ resultLabel(step.row.resultCode) }} + + +
+

{{ step.row.reason || '操作已记录' }} · {{ step.row.username || '系统' }}

+
+
+
+ + +
+
+
@@ -223,11 +265,47 @@ + + + +