fix: 重新登录后清掉上一轮已结束的运行状态
- 服务重启留下的「已中断」状态会在登录后继续压着卡片徽标、挂着旧进度和红条 - 登录成功后清掉该账号已结束的运行状态(内存 + run_state 表),正在跑的不动,内存日志保留 - 新增 store.run_state_delete(),/api/run 轮询随即把 run 置空,徽标回到「已登录」
This commit is contained in:
@@ -33,6 +33,7 @@
|
|||||||
- 服务重启把上次没跑完的运行标成「已中断」后,那句话会被后续 `set_state` 一起写回库,新一轮运行一起步就顶着「服务重启,上次运行已中断」,库里还留着 `status=studying` 的幽灵记录:`runtime.set_state()` 在状态切入 `discovering` / `studying` 时清掉上一轮的 `error` / `progress` / `finished_at`,`hydrate_runs()` 标记后立即落库
|
- 服务重启把上次没跑完的运行标成「已中断」后,那句话会被后续 `set_state` 一起写回库,新一轮运行一起步就顶着「服务重启,上次运行已中断」,库里还留着 `status=studying` 的幽灵记录:`runtime.set_state()` 在状态切入 `discovering` / `studying` 时清掉上一轮的 `error` / `progress` / `finished_at`,`hydrate_runs()` 标记后立即落库
|
||||||
- 服务重启后卡片「课程日志」显示「暂无日志」,SQLite 里的历史读不出来:前端兜底条件原为「内存为空且 status 为空」,而重启后 status 恰好是 `interrupted`(非空),历史永远不读;现在只看内存是否为空
|
- 服务重启后卡片「课程日志」显示「暂无日志」,SQLite 里的历史读不出来:前端兜底条件原为「内存为空且 status 为空」,而重启后 status 恰好是 `interrupted`(非空),历史永远不读;现在只看内存是否为空
|
||||||
- 删除账号只清了按账号 id 记的 `run_state` / `run_log`,登录日志(key 与 `login_log.username` 记的是用户名 / 手机号)残留:`account_delete()` 改为按账号 id + 用户名一起清,`DELETE /api/accounts/{id}` 同时清掉内存里两个 key 的日志
|
- 删除账号只清了按账号 id 记的 `run_state` / `run_log`,登录日志(key 与 `login_log.username` 记的是用户名 / 手机号)残留:`account_delete()` 改为按账号 id + 用户名一起清,`DELETE /api/accounts/{id}` 同时清掉内存里两个 key 的日志
|
||||||
|
- 服务重启留下的「已中断」状态在重新登录后仍然压在卡片上,徽标显示「已中断」并挂着旧进度和红条:登录成功后清掉该账号上一轮已结束的运行状态(内存 + SQLite),正在跑(`discovering` / `studying`)的不动,内存日志保留
|
||||||
|
|
||||||
### 其他
|
### 其他
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
name: study-tool
|
name: study-tool
|
||||||
version: 0.0.5
|
version: 0.0.6
|
||||||
description: 东莞市教师培训平台(jspx.dgjy.net / study.dgjy.net)多账号学习控制台
|
description: 东莞市教师培训平台(jspx.dgjy.net / study.dgjy.net)多账号学习控制台
|
||||||
|
|||||||
@@ -23,6 +23,32 @@ def _log_login(username, ok, code, error, elapsed, stage=""):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
_RUN_FIELDS = ("status", "error", "progress", "done", "total", "course",
|
||||||
|
"started", "finished_at")
|
||||||
|
|
||||||
|
|
||||||
|
def _clear_done_run(account_id):
|
||||||
|
"""重新登录后清掉上一轮已经结束的运行状态。
|
||||||
|
|
||||||
|
服务重启会把上次没跑完的运行标成「已中断」,那条状态会一直压着卡片的
|
||||||
|
「已登录」徽标、还挂着旧进度和红条;登录成功说明用户开始新一轮,
|
||||||
|
这时就该把它清掉。正在跑的(discovering / studying)绝不能动,
|
||||||
|
否则会把实时进度清没。内存里保留 log,卡片日志不受影响。
|
||||||
|
"""
|
||||||
|
key = str(account_id or "")
|
||||||
|
if not key:
|
||||||
|
return
|
||||||
|
with RUNS_LOCK:
|
||||||
|
st = RUNS.get(key)
|
||||||
|
if st and st.get("status") in ("discovering", "studying"):
|
||||||
|
return
|
||||||
|
if st:
|
||||||
|
for field in _RUN_FIELDS:
|
||||||
|
st.pop(field, None)
|
||||||
|
st["updated"] = time.time()
|
||||||
|
store.run_state_delete(key)
|
||||||
|
|
||||||
|
|
||||||
def _login_account(b: LoginIn):
|
def _login_account(b: LoginIn):
|
||||||
"""解析出一组可登录的凭据:显式传入优先,否则按账号 id 从库里取。"""
|
"""解析出一组可登录的凭据:显式传入优先,否则按账号 id 从库里取。"""
|
||||||
acc = store.account_get(b.account_id) if b.account_id else None
|
acc = store.account_get(b.account_id) if b.account_id else None
|
||||||
@@ -65,6 +91,7 @@ def api_login(b: LoginIn):
|
|||||||
_log_login(username, True, "ok", warn, time.time() - t0, "user=%s" % user)
|
_log_login(username, True, "ok", warn, time.time() - t0, "user=%s" % user)
|
||||||
if acc:
|
if acc:
|
||||||
store.account_save_login(acc["id"], user, cookies, courses)
|
store.account_save_login(acc["id"], user, cookies, courses)
|
||||||
|
_clear_done_run(acc["id"]) # 上一轮已结束的运行状态不再挂在新会话上
|
||||||
return {"ok": True, "user": user, "cookies": cookies, "courses": courses, "warn": warn}
|
return {"ok": True, "user": user, "cookies": cookies, "courses": courses, "warn": warn}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -487,6 +487,10 @@ def run_state_all():
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def run_state_delete(key):
|
||||||
|
write("DELETE FROM run_state WHERE key=?", (str(key or ""),))
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------ 页面快照
|
# ------------------------------------------------------------------ 页面快照
|
||||||
|
|
||||||
def snapshot_add(plan_id, project_id, url, html):
|
def snapshot_add(plan_id, project_id, url, html):
|
||||||
|
|||||||
Reference in New Issue
Block a user