30 KiB
30 KiB
Work Log - 需求开发(ID: 304415118593097982,系统参数菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593097982(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
systemparam菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。 - 本次实现(最小闭环,前后端联动):
- 后端新增系统参数领域能力:
- 新增模型:
api/app/models/system_param.py(system_params表,含param_key/name/value/description/status与创建/更新人、时间戳)。 - 新增 Schema:
api/app/schemas/system_param.py(列表/详情/创建/更新)。 - 新增服务:
api/app/services/system_param_service.py(列表筛选、创建、编辑、删除,含admin.system-params主题推送)。 - 新增路由:
api/app/api/v1/system_params.py:GET /api/v1/admin/system-paramsPOST /api/v1/admin/system-paramsGET /api/v1/admin/system-params/{param_id}PATCH /api/v1/admin/system-params/{param_id}DELETE /api/v1/admin/system-params/{param_id}
- 路由挂载:
api/app/api/router.py。 - 模型加载:
api/app/core/database.py、api/app/models/__init__.py引入system_param。
- 新增模型:
- 权限与菜单迁移:
api/app/services/seed_service.py新增权限:system_param.read、system_param.manage。- 新增默认菜单:
admin.system_params(标题“系统参数”,路径/admin/system-params,权限system_param.read)。 admin角色默认菜单绑定加入admin.system_params。api/app/services/admin_service.py保护菜单集合加入admin.system_params,防止被误删。api/app/services/topic_registry.py新增 Topic 权限规则:admin.system-params。
- 前端页面迁移:
- 新增页面:
web/src/app/admin/system-params/page.tsx- 列表:关键词筛选、状态筛选(全部/已启用/已禁用)、表格展示。
- 管理:新建/编辑/删除系统参数。
- 空态、加载态、错误提示、成功提示完整。
- 实时刷新:订阅
admin.system-params主题后自动刷新。
- 后台首页入口:
web/src/app/admin/page.tsx新增“系统参数”卡片。 - 菜单管理保护名单:
web/src/app/admin/menus/page.tsx加入admin.system_params。 - 类型补充:
web/src/types/auth.ts新增系统参数类型定义。
- 新增页面:
- 后端新增系统参数领域能力:
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097982 --action full --skip-build-gate
- 轨迹:
OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 命令:
- 远端状态确认:
/api/project/requirement/get/304415118593097982返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED。
Work Log - 需求开发(ID: 304415118593097985,系统日志菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593097985(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
syslog菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。 - 本次实现(前后端闭环):
- 后端系统日志查询接口:
api/app/schemas/admin.py新增AuditLogPublic、AuditLogListResponse。api/app/services/admin_service.py新增list_audit_logs(支持action、user_id过滤,按时间倒序分页)。api/app/api/v1/admin.py新增GET /api/v1/admin/audit-logs,权限要求menu.read | menu.manage。
- 权限与主题:
api/app/services/topic_registry.py新增admin.audit_logs主题权限规则(menu.read/menu.manage)。
- 菜单迁移与种子:
api/app/services/seed_service.py新增默认菜单admin.syslog(标题“系统日志”,路径/admin/syslog,权限menu.read),并加入 admin 角色默认菜单绑定。api/app/services/admin_service.py受保护菜单集合加入admin.syslog(防误删)。web/src/app/admin/menus/page.tsx前端受保护菜单集合同步加入admin.syslog。
- 前端页面迁移:
- 新增
web/src/app/admin/syslog/page.tsx:- 列表分页(
limit/offset)。 - 过滤(
action、user_id)。 - 权限拦截、空态/加载态、错误提示。
- 列表分页(
web/src/types/auth.ts新增系统日志响应类型AuditLogItem、AuditLogListResponse。web/src/app/admin/page.tsx新增“系统日志”后台入口卡片。
- 新增
- 后端系统日志查询接口:
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097985 --action full --skip-build-gate
- 轨迹:
OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 命令:
- 远端状态确认:
/api/project/requirement/get/304415118593097985返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED。
- 验收清单(交付建议):
- 功能点:列表查询、动作/用户筛选、分页切换、权限拦截、空态提示。
- 边界场景:无日志、筛选无结果、未授权访问、非法分页参数(由后端 Query 约束)。
- 回归点:后台菜单显示与跳转、受保护菜单不可删除、管理员角色默认可见系统日志菜单。
Work Log - 需求开发(ID: 304415118593097973,生命倒计时菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593097973(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
life-countdown菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”链路。 - 本次实现(前后端闭环):
- 后端领域模型与接口:
- 新增模型:
api/app/models/life_countdown.py(life_countdown_profiles,按user_id唯一存档,包含death_date、today_warning_*缓存字段)。 - 新增 Schema:
api/app/schemas/life_countdown.py(LifeCountdownProfileDto、LifeCountdownSaveDto、LifeCountdownGenerateWarningDto、LifeCountdownWarningDto)。 - 新增服务:
api/app/services/life_countdown_service.py:get_current_profile:读取当前用户档案;save_profile:保存死亡日期(空值/早于今天拦截);generate_today_warning:按天缓存今日警示语,支持forceRefresh,无可用模型时回退默认文案;- 模型路由优先
CAPABILITY: life-countdown.warning,再 fallback 到GLOBAL: __global__。
- 新增路由:
api/app/api/v1/life_countdown.py:GET /api/v1/admin/life-countdown/currentPOST /api/v1/admin/life-countdown/savePOST /api/v1/admin/life-countdown/generate-warning- 权限:读取
life_countdown.read|manage,写入与生成life_countdown.manage。
- 路由挂载:
api/app/api/router.py挂载life_countdown_router。 - 模型加载:
api/app/models/__init__.py、api/app/core/database.py引入life_countdown,确保建表时元数据可见。
- 新增模型:
- 权限与菜单接入:
api/app/services/seed_service.py新增权限:life_countdown.read、life_countdown.manage。- 新增默认菜单:
admin.life_countdown(标题“生命倒计时”,路径/admin/life-countdown,权限life_countdown.read)。 - admin 角色默认权限/菜单绑定加入生命倒计时。
api/app/services/admin_service.py受保护菜单集合加入admin.life_countdown(防误删)。web/src/app/admin/menus/page.tsx前端菜单管理保护名单同步加入admin.life_countdown。
- 前端页面迁移:
- 新增页面:
web/src/app/admin/life-countdown/page.tsx:- 死亡日期保存(date input + 保存按钮);
- 实时倒计时(年/天/时/分/秒);
- 今日警示语生成与强制刷新(缓存命中提示);
- 权限拦截、加载态、空态、错误/成功反馈。
web/src/app/admin/page.tsx新增“生命倒计时”入口卡片。web/src/types/auth.ts新增LifeCountdownProfile与LifeCountdownWarning类型定义。
- 新增页面:
- 后端领域模型与接口:
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097973 --action full --skip-build-gate
- 轨迹:
OPEN -> IN_PROGRESS -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 命令:
- 远端状态确认:
/api/project/requirement/get/304415118593097973返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED。
- 验收清单(交付建议):
- 功能点:死亡日期保存、倒计时实时计算、警示语生成/重刷、当日缓存复用、菜单展示与权限控制。
- 边界场景:未设置死亡日期、死亡日期早于今天、死亡日期已过、无模型路由/无有效 key 回退默认文案。
- 回归点:后台首页卡片跳转、侧栏菜单显示、菜单管理受保护不可删。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库存在本需求外历史改动,脚本
changedFiles会包含非本需求文件;本需求交付聚焦生命倒计时链路。
Work Log - 需求开发(ID: 304415118593097988,用户管理菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593097988(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
user_mgr菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。 - 本次实现(最小增量,前后端联动):
- 前端用户管理页补齐“状态管理”操作(
web/src/app/admin/users/page.tsx):- 新增“启用/禁用”按钮,按当前状态自动切换;
- 调用既有后端接口
PATCH /api/v1/users/{user_id},提交{ status: "active" | "disabled" }; - 操作进行中显示“更新中...”,成功后提示“用户已启用/用户已禁用”,并刷新用户列表;
- 增加保护:禁止修改当前登录账号状态,避免误禁用自己导致会话中断;
- 状态列展示中文化(
active -> 启用、disabled -> 禁用)。
- 维持并复用既有能力:
- 用户创建(含前端重复校验 + 后端唯一约束);
- 角色分配(
POST /api/v1/users/{user_id}/roles); - 密码重置(
POST /api/v1/users/{user_id}/password); - 用户删除(
DELETE /api/v1/users/{user_id}); - 菜单/权限链路沿用现有
admin.users+user.manage(种子与菜单映射已存在)。
- 前端用户管理页补齐“状态管理”操作(
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097988 --action full --skip-build-gate
- 轨迹:
OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 命令:
- 远端状态确认:
/api/project/requirement/get/304415118593097988返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED。
- 验收清单(交付建议):
- 功能点:新增用户、分配角色、重置密码、删除用户、启用/禁用用户、状态文案展示。
- 边界场景:重复 user_id/email/username 拦截、角色为空或非法拒绝、当前登录账号禁止自我禁用、未授权访问拒绝(
user.manage)。 - 回归点:后台首页入口与侧栏菜单可达、用户状态切换后会话与鉴权行为符合预期(被禁用用户被拒绝访问)。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 仓库当前存在其他需求的未提交改动,脚本
changedFiles为工作区整体视图,不仅限本需求文件。
Work Log - Docker 构建排障(api 基础镜像拉取 EOF)
- 触发问题:
docker compose build阶段,api在拉取docker.m.daocloud.io/library/python:3.11-slimmetadata 时失败:failed to do request: Head .../manifests/3.11-slim: EOF
- 排查与验证:
- 手动拉取基础镜像:
docker pull docker.m.daocloud.io/library/python:3.11-slim,结果成功(镜像可达,判定为镜像站瞬时网络抖动)。 - 端到端复验:
docker compose build api,结果成功(fquiz-api Built)。
- 手动拉取基础镜像:
- 结论:
- 本次为外部镜像源瞬时异常,不涉及仓库代码缺陷;重试即可恢复。
- 保留口径:
- 若同类错误持续出现,优先重试构建;仍失败时在
.env覆盖PYTHON_BASE_IMAGE=python:3.11-slim作为兜底。
- 若同类错误持续出现,优先重试构建;仍失败时在
Work Log - 需求开发(ID: 304415118593098000,代码评审菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593098000(标题:[fquiz迁移] 代码评审 菜单功能迁移),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
code-review菜单能力迁移到 fquiz,覆盖菜单可见、路由可达、权限链路与菜单保护。 - 本次实现(最小增量,复用既有需求管理能力):
- 后端菜单种子与角色绑定:
api/app/services/seed_service.py- 新增默认菜单
admin.code_review(标题“代码评审”,路径/admin/code-review,权限requirement.read,排序 49)。 admin角色默认菜单绑定加入admin.code_review。
- 新增默认菜单
- 菜单删除保护:
api/app/services/admin_service.py- 受保护菜单集合加入
admin.code_review,防止在菜单管理页被误删。
- 受保护菜单集合加入
web/src/app/admin/menus/page.tsx- 前端受保护菜单集合同步加入
admin.code_review。
- 前端受保护菜单集合同步加入
- 前端入口与路由迁移:
web/src/app/admin/page.tsx- 新增“代码评审”后台入口卡片(权限:
requirement.read)。
- 新增“代码评审”后台入口卡片(权限:
- 新增
web/src/app/admin/code-review/page.tsx- 采用复用方式导出
requirements页面:export { default } from "@/app/admin/requirements/page";,保证/admin/code-review可直接承接现有“需求流转+评审协作”能力。
- 采用复用方式导出
- 后端菜单种子与角色绑定:
- 技能脚本执行与状态处理:
- 执行命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098000 --action full --skip-build-gate --force-complete-if-already-completed
- 说明:该需求在执行时远端已是
COMPLETED,脚本走forced-complete-already-completed模式,执行一次COMPLETED(100)写回。
- 执行命令:
- 远端状态确认:
/api/project/requirement/get/304415118593098000返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED(updateDate=2026-04-18T12:46:22.187463)。
- 验收清单(交付建议):
- 功能点:后台首页可见“代码评审”入口;侧栏菜单可显示并可跳转
/admin/code-review;进入后可复用现有需求处理能力。 - 边界场景:无
requirement.read权限账号不可见/不可访问;菜单管理页无法删除受保护菜单admin.code_review。 - 回归点:
admin角色默认菜单包含admin.code_review;与admin.requirements并存时均可正常访问。
- 功能点:后台首页可见“代码评审”入口;侧栏菜单可显示并可跳转
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库存在多需求并行改动,工作区为脏状态;本次交付聚焦
code-review菜单迁移相关改动。
Work Log - 需求开发(ID: 304415118593097994,系统消息菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593097994(标题:[fquiz迁移] 系统消息 菜单功能迁移),并遵循本次任务要求:跳过构建门禁(--skip-build-gate),不做编译/构建与额外回归测试。 - 需求要点:将 quiz 的
systemmessage菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”链路。 - 本次实现(前后端闭环):
- 后端领域能力:
- 新增模型:
api/app/models/system_message.py(system_messages表,含title/content/level/status/start_at/end_at与创建/更新人、时间戳)。 - 新增 Schema:
api/app/schemas/system_message.py(列表、创建、更新 DTO;start_at <= end_at校验)。 - 新增服务:
api/app/services/system_message_service.py- 列表筛选(关键词、状态、等级);
- 创建/编辑/删除;
- 详情读取与用户信息序列化;
- 发布实时主题
admin.system-messages(创建/更新/删除)。
- 新增路由:
api/app/api/v1/system_messages.pyGET /api/v1/admin/system-messagesPOST /api/v1/admin/system-messagesGET /api/v1/admin/system-messages/{message_id}PATCH /api/v1/admin/system-messages/{message_id}DELETE /api/v1/admin/system-messages/{message_id}- 权限:读取
system_message.read|system_message.manage;写入system_message.manage。
- 路由挂载与模型注册:
api/app/api/router.py挂载system_messages_router;api/app/core/database.py、api/app/models/__init__.py引入system_message。
- 新增模型:
- 权限、菜单与主题:
api/app/services/seed_service.py新增权限:system_message.read、system_message.manage。- 新增默认菜单:
admin.system_message(标题“系统消息”,路径/admin/system-message,权限system_message.read)。 - admin 角色默认菜单绑定加入
admin.system_message。 api/app/services/admin_service.py后端受保护菜单集合加入admin.system_message。api/app/services/topic_registry.py新增主题权限规则:admin.system-messages。web/src/app/admin/menus/page.tsx前端受保护菜单集合同步加入admin.system_message。
- 前端页面迁移:
- 新增
web/src/app/admin/system-message/page.tsx:- 列表查询(关键词、状态、等级);
- 新建/编辑/删除系统消息;
- 生效/失效时间编辑;
- 权限拦截、空态/加载态、错误/成功提示;
- 订阅
admin.system-messages主题后自动刷新。
web/src/app/admin/page.tsx新增“系统消息”入口卡片。web/src/types/auth.ts新增系统消息类型:SystemMessageSummary、SystemMessageListResponse等。
- 新增
- 后端领域能力:
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097994 --action full --skip-build-gate
- 轨迹:
OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 命令:
- 远端状态确认:
/api/project/requirement/get/304415118593097994返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED(updateDate=2026-04-18T13:07:37.957567)。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 仓库当前为脏工作区,脚本
changedFiles会包含本需求外文件;本次交付聚焦系统消息链路相关改动。
Work Log - 需求开发(ID: 304415118593098165,数据源管理菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能处理 1 条OPEN需求,遵循本次任务约束:仅处理 1 条、跳过构建门禁(--skip-build-gate)、不做额外回归测试。 - 执行命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --auto-query --action full --status OPEN --project-name fquiz --max-items 1 --skip-build-gate --checkpoint-file skills/fquiz-requirement-develop/runtime/subagent-open-1.ckpt.json --reset-checkpoint
- 处理结果:
- 命中需求:
304415118593098165([fquiz迁移] 数据源管理 菜单功能迁移),初始状态OPEN。 - 状态轨迹:
OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100),各阶段 HTTP 状态均为200。
- 命中需求:
- 说明:
- 当前仓库工作区为脏状态,脚本
changedFiles为全局视图,包含本需求外文件;本次仅按技能脚本完成需求状态闭环。
- 当前仓库工作区为脏状态,脚本
Work Log - 前端全量 Radix 化(弃用语义样式 + 替换原生组件)
- 背景:根据用户要求,前端页面“完全弃用自定义语义样式”,并将页面中原生组件统一替换为
@radix-ui/themes组件。 - 本次改造(
web):- 样式层:
- 清理
web/src/app/globals.css中旧语义类定义(surface-card/btn-*/control/table-*/notice*/text-muted等)。 - 页面改为直接使用 Radix 组件 + token 类(
var(--gray-*)/var(--accent-*))。
- 清理
- 组件层:
- 原生组件全量替换为 Radix Themes 组件:
button->Buttontable/thead/tbody/tr/th/td->Table.Root/Header/Body/Row/ColumnHeaderCell/Cellinput->TextField.Roottextarea->TextAreaselect->Select.Root/Trigger/Content/Itemcheckbox->Checkbox
- 覆盖首页与后台主要页面:
/、/admin/layout、/admin/{users,roles,menus,models,requirements,todos,chat,syslog,files,password,system-message,system-params,token-usage,life-countdown}。
- 原生组件全量替换为 Radix Themes 组件:
- 类型与构建修复:
- 为
onChange/onValueChange/onCheckedChange补全显式类型,消除noImplicitAny报错。 - 修复自动替换阶段造成的
import type语句结构问题(password/files页面)。
- 为
- 样式层:
- 验证:
- 语义类清理检查:
rg -n "surface-card|btn-primary|control|table-modern|text-muted" web/src -S(无命中) - 原生标签检查:
rg --case-sensitive -n "<button\b|<input\b|<select\b|<textarea\b|<table\b|<thead\b|<tbody\b|<tr\b|<th\b|<td\b" web/src(无命中) - 构建:
npm run build:web通过。
- 语义类清理检查:
- 风险与说明:
- 本次为大范围 UI 层替换,业务逻辑未扩改;但页面视觉细节(按钮密度、表格间距、控件外观)与旧版存在差异,建议后续做一轮人工体验回归。
Work Log - Web 构建失败修复(admin/files 上传控件类型错误)
- 触发问题:
next build在 TypeScript 阶段失败,报错位于web/src/app/admin/files/page.tsx:TextField.Root的type不接受"file"。 - 根因:
@radix-ui/themes当前TextField.Root的type类型联合不包含file,将其当作文件上传控件会触发编译期类型错误。 - 修复动作(最小改动):
- 文件:
web/src/app/admin/files/page.tsx - 将上传控件从
TextField.Root type=\"file\"替换为原生<input type=\"file\">,保留原有onChange、禁用态与上传逻辑不变。
- 文件:
- 验证结果:
- 命令:
cd web && npm run build - 结果:构建成功,TypeScript 检查通过,
/admin/files页面参与静态页生成无报错。
- 命令:
- 风险与影响:
- 影响面仅前端上传输入控件渲染层;API 调用、上传 mutation、鉴权与文件管理其他行为不受影响。
Work Log - 前端主题改造(纯 Radix 风格)
- 背景:用户反馈“当前主题仍像自定义样式”,要求改为纯 Radix 风格。
- 本次改造(
web/src/app/**):- 主题入口纯化:
web/src/app/layout.tsx去除app-theme-root包裹样式类,仅保留ThemeProvider。web/src/app/globals.css删除字体栈覆盖、.radix-themestoken 二次映射、全局渐变背景,仅保留@import "tailwindcss"与body基础高度。
- 后台壳层纯化:
web/src/app/admin/layout.tsx去除背景光斑/渐变与硬编码色值,导航与头部改为Card/Flex/Text/Heading/Button/Callout组合。web/src/app/admin/page.tsx首页卡片改为Card + Text的 Radix 语义结构。
- 交互控件统一:
- 批量将
Button的长 Tailwind 颜色类替换为 Radix 属性(variant/color/size)。 - 典型页面已落地:
requirements、chat、files、menus、models、roles、users、todos、system-message、system-params、password、mindmap。
- 批量将
- 主题入口纯化:
- 验证:
npm run lint:web:仍存在仓库既有问题(admin/life-countdown的react-hooks/set-state-in-effecterror,admin/password1 条 hooks warning),与本次主题改造无直接关联。- 目标文件校验:
cd web && npx eslint src/app/layout.tsx src/app/admin/layout.tsx src/app/admin/page.tsx src/app/admin/chat/page.tsx src/app/admin/files/page.tsx src/app/admin/menus/page.tsx src/app/admin/models/page.tsx src/app/admin/requirements/[id]/page.tsx src/app/admin/requirements/new/page.tsx src/app/admin/requirements/page.tsx src/app/admin/roles/page.tsx src/app/admin/todos/page.tsx src/app/admin/users/page.tsx src/app/admin/password/page.tsx src/app/admin/mindmap/page.tsx通过(0 error)。
- 风险与说明:
- 本次涉及前端样式层批量替换,业务逻辑未改;局部页面的视觉密度(按钮大小/间距)可能与旧版不同,建议按关键管理页面做一轮人工浏览验收。
Work Log - 需求开发(ID: 304415118593098012,日程管理菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593098012(标题:[fquiz迁移] 日程管理 菜单功能迁移),并遵循本次任务要求:不做编译/构建检查与额外回归测试。 - 需求要点:将 quiz 来源菜单
schedule(标题“日程管理”)迁移到 fquiz,并覆盖菜单可见性、权限链路、路由可达与菜单保护。 - 本次实现(最小改动,复用既有待办能力):
- 后端菜单与角色绑定:
api/app/services/seed_service.py- 新增默认菜单
admin.schedule(标题“日程管理”,路径/admin/schedule,图标CalendarDays,排序51,权限todo.read)。 admin角色默认菜单绑定加入admin.schedule。
- 新增默认菜单
- 菜单保护:
api/app/services/admin_service.py后端受保护菜单集合加入admin.schedule,防止菜单管理误删。web/src/app/admin/menus/page.tsx前端受保护菜单集合同步加入admin.schedule。
- 前端入口与路由迁移:
web/src/app/admin/page.tsx新增“日程管理”卡片入口(权限todo.read)。- 新增
web/src/app/admin/schedule/page.tsx,复用todos页面:export { default } from "@/app/admin/todos/page";,保证/admin/schedule直接承接现有“待办/日程管理”完整交互能力(筛选、流转、创建、删除、权限拦截)。
- 后端菜单与角色绑定:
- 需求状态流转(脚本):
- 首次执行(OPEN 闭环):
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098012 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection- 轨迹:
OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)(HTTP 200)。
- 断点重启回写(已 COMPLETED 重派发):
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098012 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed- 轨迹:
COMPLETED(100)强制回写(HTTP 200)。
- 首次执行(OPEN 闭环):
- 远端状态确认:
/api/project/requirement/get/304415118593098012返回status=COMPLETED、progressPercent=100、resultMsg=开发完成:状态置为 COMPLETED。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库为多需求并行脏工作区,技能脚本的
changedFiles为工作区整体视图;本次交付聚焦日程管理菜单迁移相关改动。
Work Log - 需求开发(ID: 304415118593098006,标签管理菜单功能迁移)
- 背景:按
fquiz-requirement-develop技能推进需求304415118593098006(标题:[fquiz迁移] 标签管理 菜单功能迁移),遵循本次规则:默认不做构建/编译检查与额外回归测试。 - 关键现状:远端该需求在执行时已是
COMPLETED;按“断点重启”口径执行强制完成写回,确保流程闭环留痕。 - 本次实现(最小闭环,前后端联动):
- 后端标签管理能力补齐(复用题库域):
api/app/services/question_bank_service.py:新增标签聚合查询、标签重命名、标签删除(批量解除关联)服务逻辑;并在题库变更时统一推送admin.question_bank主题事件。api/app/api/v1/question_bank.py:新增标签接口:GET /api/v1/admin/question-bank/tagsPATCH /api/v1/admin/question-bank/tags/renameDELETE /api/v1/admin/question-bank/tags
api/app/schemas/question_bank.py:补齐QuestionTag*请求/响应模型。
- 菜单迁移与权限链路:
api/app/services/seed_service.py:新增默认菜单admin.tag(/admin/tag,标题“标签管理”,权限question_bank.read),并加入 admin 角色默认菜单绑定。api/app/services/admin_service.py:受保护菜单集合加入admin.tag(防止菜单管理误删)。web/src/app/admin/menus/page.tsx:前端受保护菜单集合同步加入admin.tag。
- 前端页面与入口:
- 新增
web/src/app/admin/tag/page.tsx:实现标签列表、关键词筛选、重命名弹窗、删除确认、成功/失败反馈、空态/加载态;并订阅admin.question_bank主题自动刷新。 web/src/app/admin/page.tsx:新增“标签管理”入口卡片。web/src/types/auth.ts:补齐QuestionTagSummary/QuestionTagListResponse/QuestionTagMutationResponse类型,并修复QuestionBankListResponse缺失。
- 新增
- 后端标签管理能力补齐(复用题库域):
- 需求状态流转(脚本):
- 命令:
python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098006 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed
- 结果:
COMPLETED(100)写回成功(HTTP 200)。
- 命令:
- 风险与说明:
- 当前仓库为多需求并行脏工作区,脚本
workspaceChanges为全局视图;本次交付聚焦“标签管理菜单迁移”相关改动。 - 本次按任务要求未执行构建与额外回归测试。
- 当前仓库为多需求并行脏工作区,脚本