Skip to content

[app-task] refactor: 纯调度执行器 + WebUI 登录 + 定时出题链路修复与独立部署 - #83

Merged
atoncooper merged 7 commits into
mainfrom
feat/app-task-scheduler-webui-login
Aug 20, 2026
Merged

[app-task] refactor: 纯调度执行器 + WebUI 登录 + 定时出题链路修复与独立部署#83
atoncooper merged 7 commits into
mainfrom
feat/app-task-scheduler-webui-login

Conversation

@atoncooper

Copy link
Copy Markdown
Owner

概述

将 app-task 从旧「出题执行器」重构为纯调度执行器(通用 task/task_log + executor + queue),补全定时出题全链路契约修复,并新增 WebUI 控制台(用户名+密码登录)独立 docker-compose 部署

改动(按模块 7 个 commit)

Commit 模块 说明
b6c27af app-task 纯调度器重构(executor http/lua + queue WAL + email_queue 投递)+ 嵌入式 WebUI 控制台(独立 /login、用户名密码登录、webui_user 表 bcrypt、默认 admin/app-task-admin、仅 admin 管账户、限流/CORS/安全头)+ 独立 docker-compose 启动
9a0a3e4 task-quiz 出题链路契约修复:task_id 走 X-Task-Id 头兜底(修 422)、uid 进 payload(修 detail 404)、cc_emails JSON 列读写(修 1064)、INSERT 补 overdue_emailed(修 1364);数据访问下沉 repository/quiz_task_repository.py
3dbf128 app 修复 lifespan asyncio 未导入导致启动失败
b9ee7d3 frontend task-quiz 新契约适配 frontendv2(列表 payload/状态枚举/批量答题//tasks/{id}/detail 详情端点 + 404 兜底)
68ed17c apisix app-task 回调/邮件/脚本路由(key-auth)
9cec6e8 docker 根 compose 对齐 app-task 独立 MySQL 与 profiles
2f98711 docs CLAUDE.md §2.7/§5/§11、app-task/README、docs/app-task、setup-guide、.env.example 全量同步;根 README 部署启动指向 docs/

验证

  • ruff check(app/)通过;py_compile 通过
  • go test ./...(app-task)全量通过(含 WebUI 登录/限流/页面门禁/账户管理测试)
  • node --check(WebUI SPA)
  • 容器端到端实测:admin 登录、member 403、账户增删、页面门禁 302 均符合预期

部署注意

  • 主 app 与 app-task 均需重建镜像 + 重启(改动了 Python/Go/前端资源)
  • WebUI 控制台默认账户 admin / app-task-admin生产务必登录后在「账户」页改密
  • app-task 可用 cd app-task && docker compose up -d --build 独立拉起(不依赖主栈)

- 删除 xxl-job/mongo/notification_worker/app_client/latex 等旧执行器实现,重构为
  通用 task/task_log 纯调度 + executor(http/lua) + queue(WAL) + email_queue 投递
- 新增嵌入式 WebUI 控制台(go:embed):独立 /login 登录页 + 用户名密码登录
  (webui_user 表,bcrypt,默认 admin/app-task-admin,仅 admin 管账户) + 会话 Cookie
  + 每IP限流/CORS/安全响应头
- 新增 app-task/docker-compose.yml 独立启动(自带 MySQL,不拉起主栈) + .env.example
- default.yaml/README 同步
…erdue_emailed)并新增 repository/quiz_task_repository

- internal_quiz:task_id 改可选走 X-Task-Id 头兜底(原必填导致 Pydantic 422),
  generate 使用解析后的 task_id
- task_quiz register:uid 进 payload(否则业务行 uid=0,detail 按真实 uid 404)
- cc_emails 为 JSON 列:写入 json.dumps / 读取 json.loads(1064 语法错误修复)
- quiz_task INSERT 补 overdue_emailed(1364 无默认值修复)+ models server_default
- 数据访问从 services 下沉 repository/quiz_task_repository.py(服务层只留业务编排)
- 移除旧 task_quiz_task 迁移逻辑(database.py/system.sql/models.py)
lifespan 函数内在第 227 行使用 asyncio.create_task,但 asyncio 到函数内
崩溃恢复块才局部 import,被当作函数局部变量未绑定即引用而报错;改为顶部
模块级 import 并移除函数内局部 import
- TaskQuizListItem 改 taskType+payload(app-task 列表不再返回 prompt)
- getTask 改打 /tasks/{id}/detail(业务详情在主 app);未触发任务 404 时
  用列表项合成待触发视图兜底
- 状态枚举补 generating/awaiting_answer/running(业务态与调度态并集)
- 详情页/列表页/答题页适配新字段与状态;脚本审计 operator 填登录用户名
- CLAUDE.md §2.7/§5/§11 对齐纯调度器架构与数据归属;README 部署启动指向 docs/
- app-task/README、docs/app-task.md、docs/setup-guide.md、根 .env.example 同步
  独立 compose、默认 admin 登录、废弃变量标注
@atoncooper
atoncooper merged commit 5ea7416 into main Aug 20, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant