fix: 版本检查 — 后端设置 checked 字段 + 前端 info 合并显示

- UpdateService.status 增加 checked/current_version/latest_version
- _check_version 成功后设置 checked=True
- 设置页 update-notes 合并版本信息和时间戳 (替代 innerHTML 覆盖)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
qinglong
2026-06-13 21:29:35 +08:00
parent 68717daefb
commit 94d56d8210
2 changed files with 7 additions and 3 deletions
+3 -1
View File
@@ -77,7 +77,8 @@ class UpdateService:
self._task: Optional[asyncio.Task] = None self._task: Optional[asyncio.Task] = None
self._running = False self._running = False
self.status: dict = {"state": "idle", "progress": 0, "error": "", self.status: dict = {"state": "idle", "progress": 0, "error": "",
"last_check": 0, "update_available": False} "last_check": 0, "checked": False, "update_available": False,
"current_version": "", "latest_version": ""}
# 从配置读取分支和仓库地址 # 从配置读取分支和仓库地址
try: try:
init = self.sm.get_service("init") init = self.sm.get_service("init")
@@ -109,6 +110,7 @@ class UpdateService:
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
data = await loop.run_in_executor(None, self._sync_fetch_json, self.version_url) data = await loop.run_in_executor(None, self._sync_fetch_json, self.version_url)
self.status["last_check"] = time.time() self.status["last_check"] = time.time()
self.status["checked"] = True
if not data: if not data:
return return
remote_fw = data.get("framework", {}) remote_fw = data.get("framework", {})
+4 -2
View File
@@ -93,12 +93,13 @@
var r = await fetch("./api/updates"), d = await r.json(); var r = await fetch("./api/updates"), d = await r.json();
document.getElementById("ver-current").textContent = d.current_version || d.latest_version || "?"; document.getElementById("ver-current").textContent = d.current_version || d.latest_version || "?";
var badge = document.getElementById("ver-badge"); var badge = document.getElementById("ver-badge");
var notesHtml = "";
if (d.update_available) { if (d.update_available) {
badge.textContent = "↻ " + d.latest_version + " 可用"; badge.textContent = "↻ " + d.latest_version + " 可用";
badge.style.background = "var(--success,#4caf50)"; badge.style.background = "var(--success,#4caf50)";
badge.style.color = "#fff"; badge.style.color = "#fff";
document.getElementById("btn-apply").style.display = "inline-block"; document.getElementById("btn-apply").style.display = "inline-block";
document.getElementById("update-notes").innerHTML = d.latest_version ? "最新版本: <b>"+esc(d.latest_version)+"</b>" : ""; notesHtml = d.latest_version ? "最新版本: <b>"+esc(d.latest_version)+"</b>" : "";
} else if (d.checked) { } else if (d.checked) {
badge.textContent = "✓ 已是最新"; badge.textContent = "✓ 已是最新";
badge.style.background = "var(--md-sys-color-surface-container-lowest)"; badge.style.background = "var(--md-sys-color-surface-container-lowest)";
@@ -108,8 +109,9 @@
badge.textContent = "⏳ 等待检查..."; badge.textContent = "⏳ 等待检查...";
} }
if (d.last_check) { if (d.last_check) {
document.getElementById("update-notes").innerHTML += " <span style='font-size:.75rem;color:var(--text-dim)'>上次检查: "+new Date(d.last_check*1000).toLocaleString()+"</span>"; notesHtml += (notesHtml ? " | " : "") + "上次检查: "+new Date(d.last_check*1000).toLocaleString();
} }
document.getElementById("update-notes").innerHTML = notesHtml;
} catch(e) {} } catch(e) {}
} }