From 9f2b90aeca715af2a303f35171eebdf8268d89a6 Mon Sep 17 00:00:00 2001 From: Pine Date: Wed, 19 Aug 2026 15:06:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=92=8C=E6=96=87=E6=A1=A3=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=AE=89=E8=A3=85=E5=8C=85=E4=B8=8B=E8=BD=BD=E5=92=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/main.py | 6 ++-- docs/update-check.md | 67 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 docs/update-check.md diff --git a/backend/app/main.py b/backend/app/main.py index f5e659e..07a3246 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -108,8 +108,8 @@ app.add_api_route("/admin/logout", admin_logout, methods=["GET"], include_in_sch _DOWNLOAD_ROOT = Path(__file__).resolve().parent.parent # backend/ -@app.get("/download", include_in_schema=False) -@app.get("/11", include_in_schema=False) +@app.get("/download") +@app.get("/11") async def download_installer(): """下载 Windows 客户端安装包(backend/ 下 *.setup.exe,如 云超服..._x64-setup.exe)。""" for f in sorted(_DOWNLOAD_ROOT.glob("*setup.exe")): @@ -146,7 +146,7 @@ class UpdateCheckBody(BaseModel): current: str = "" # 前端上报的当前版本,如 0.1.0 -@app.post("/api/update/check", include_in_schema=False) +@app.post("/api/update/check") async def update_check(body: UpdateCheckBody): """检测更新:返回最新版本号、安装包下载地址、是否需要更新(仅 Windows)。""" inst = _latest_installer() diff --git a/docs/update-check.md b/docs/update-check.md new file mode 100644 index 0000000..5a33702 --- /dev/null +++ b/docs/update-check.md @@ -0,0 +1,67 @@ +# 客户端更新检测与安装(Windows)—— 接口文档 + +> 展播端(Tauri Windows 应用)检测后端是否有新版本安装包,下载并启动安装。仅 Windows。 + +## 一、检测更新接口 + +**`POST /api/update/check`** + +请求体: +```json +{ "current": "0.1.0" } // 前端上报的当前安装版本(Tauri getVersion) +``` + +响应: +```json +{ + "ok": true, + "latest_version": "0.1.1", + "installer_name": "云超服昆创园OPC运营中心_0.1.1_x64-setup.exe", + "download_url": "/download", + "update_available": true +} +``` + +字段: +| 字段 | 说明 | +|---|---| +| `ok` | 是否成功 | +| `latest_version` | 最新版本号(从安装包文件名解析) | +| `installer_name` | 安装包文件名 | +| `download_url` | 安装包下载相对路径(前缀 `api_base`) | +| `update_available` | 是否需要更新(`latest > current`) | + +**最新版本如何确定**:扫描 `backend/` 目录下 `*.setup.exe`,从文件名正则 `_(\d+\.\d+(?:\.\d+)?)` 提取版本号(如 `..._0.1.1_x64-setup.exe` → `0.1.1`)。文件名倒序取第一个。 + +## 二、下载安装包接口 + +**`GET /download`**(别名 `/11`)—— 返回 `backend/` 下最新安装包,`application/octet-stream` 附件下载。 + +## 三、前端流程 + +| 文件 | 逻辑 | +|---|---| +| `src/utils/updateCheck.js` | `getCurrentVersion()` 用 Tauri `getVersion()` 读真实版本 → `checkForUpdate()` 调 `/api/update/check` → `downloadAndInstall()` fetch 下载字节 | +| `src/components/UpdateNotify.jsx` | 检测到更新弹底部提示;点「下载更新」→ 下载 → 启动安装 → 应用退出 | +| Rust `install_update` | 写盘到 `%TEMP%` → 启动安装程序 → 0.8s 后 `app.exit(0)` | + +触发时机:启动静默查一次 + 每 30 分钟自动查 + 点页眉 logo 主动查。 + +## 四、发布新版本步骤 + +1. 把新安装包放入 `backend/`,文件名带版本号:`云超服昆创园OPC运营中心_0.2.0_x64-setup.exe`。 +2. 同步改 `package.json` 的 `version`(Tauri `getVersion` 读取它)。 +3. 重启后端 + 重新打包前端 `yarn build:win`。 +4. 安装端检测到 `latest > current` → 弹更新提示 → 下载安装。 + +## 五、验证 + +```bash +curl -X POST http://192.168.1.9:10085/api/update/check \ + -H "Content-Type: application/json" -d '{"current":"0.1.0"}' +``` +`backend/` 有更高版本安装包时返回 `update_available: true`。 + +## 六、注意 +- 当前按「文件名倒序取第一个」判定最新;若目录同时存在多个版本(如 `0.9` 与 `0.10`),字符串倒序可能取错。多版本共存时应改为「解析全部版本号 → 取数值最大」。 +- `downloadAndInstall` 经 `invoke` 传递安装包字节(约 2.5MB,JSON 数组稍慢);如需更快可改 Rust 端直接 HTTP 下载。