Files
fquiz/memory/2026-04-19.md
T

1360 lines
93 KiB
Markdown
Raw Normal View History

## Work Log - 需求开发(ID: 304415118593098036,诗词本菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098036`(标题:`[fquiz迁移] 诗词本 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁(按回退重派语义采用断点重启执行口径)。
- 本次实现(最小改动,复用现有词条能力承接“诗词本”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保持菜单编码 `admin.vocabulary` 与权限 `vocabulary.read` 不变,避免扩大权限与接口变更范围。
- 菜单文案改为 `诗词本`,路由改为 `/admin/poetry`
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“生字本(/admin/vocabulary)”迁移为“诗词本(/admin/poetry)”。
- 前端页面文案同步:
- `web/src/app/admin/vocabulary/page.tsx`
- 页面加载态、未登录提示、模块标题与说明文案从“生字本”同步为“诗词本”。
- `web/src/app/admin/poetry/page.tsx`
- 继续复用词条页面:`export { default } from "../vocabulary/page";`,确保 `/admin/poetry` 可直接承接完整交互能力(列表检索、新增编辑删除、权限拦截、加载态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098036 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098036` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“诗词本”入口并可跳转 `/admin/poetry`
- 诗词本页面支持词条列表检索、新增/编辑/删除与状态切换;
- 权限码 `vocabulary.read / vocabulary.manage` 控制读写行为。
- 边界场景:
- 未登录访问提示与返回首页链路正常;
- 无权限账号访问显示权限提示;
- 空列表展示空态文案。
- 回归点:
- 菜单管理页仍保护 `admin.vocabulary` 菜单编码,避免误删;
- 既有 `vocabulary` 后端接口与推送主题 `admin.vocabulary` 行为不受影响。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限诗词本模块。
## Work Log - 需求开发(ID: 304415118593098018Jwt生成器菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098018`(标题:`[fquiz迁移] Jwt生成器 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁(按回退重派语义断点重启执行)。
- 本次实现(最小改动,完成 Jwt 生成器迁移落点):
- 后端接口与鉴权:
- 新增 `api/app/api/v1/jwt_generator.py`
- `GET /api/v1/admin/jwt-generator/users`:按关键词/状态分页查询用户(权限:`jwt_generator.read | jwt_generator.manage`)。
- `POST /api/v1/admin/jwt-generator/generate`:为指定用户生成 token(权限:`jwt_generator.manage`)。
- `api/app/api/router.py` 注册 `jwt_generator_router`
- 新增 `api/app/services/jwt_generator_service.py`
- 复用现有 `create_access_token`,写入 `sub/roles/permissions/exp` 声明。
- 生成前校验用户存在且 `status=active`
- 支持 `expires_minutes` 可选覆盖。
- 新增 `api/app/schemas/jwt_generator.py`
- 用户列表 DTO、生成请求 DTO(含参数校验)、生成响应 DTO(包含 `expires_at/role_codes/permission_codes`)。
- 权限点与菜单迁移:
- `api/app/services/seed_service.py`
- 新增权限 `jwt_generator.read``jwt_generator.manage` 并加入 `admin` 默认权限。
- 新增菜单 `admin.jwt_generator`(标题 `Jwt生成器`,路径 `/admin/jwt-generator`,权限 `jwt_generator.read`)。
- `admin` 角色默认菜单绑定加入 `admin.jwt_generator`
- `api/app/services/admin_service.py`
- 受保护菜单白名单加入 `admin.jwt_generator`,避免被误删。
- `web/src/app/admin/menus/page.tsx`
- 前端菜单管理页受保护菜单集合加入 `admin.jwt_generator`
- 前端页面与入口:
- 新增 `web/src/app/admin/jwt-generator/page.tsx`
- 输入 `user_id` 并调用后端生成 token。
- 覆盖加载态、无权限态、错误态、结果展示(`token_type/expires_in/access_token`)与复制操作。
- `web/src/app/admin/page.tsx` 新增“Jwt生成器”入口卡片(权限:`jwt_generator.read | jwt_generator.manage`)。
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --action full --requirement-id 304415118593098018 --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库为多需求并行改动,技能脚本 `changedFiles` 统计为工作区整体,不仅限 Jwt 生成器模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098024`(标题:`[fquiz迁移] AI聊天 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098024 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed`
- 状态流转结果(HTTP 均 200):
- `OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`
- 需求对应能力落点(当前工作区可见):
- 后端权限与菜单:`api/app/services/seed_service.py``chat.use``admin.chat` 菜单 `/admin/chat`、admin 默认菜单绑定)
- 菜单保护:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx`(受保护菜单含 `admin.chat`
- 聊天接口:`api/app/api/v1/chat.py`(会话列表/创建、消息列表/发送)
- 前端页面与入口:`web/src/app/admin/chat/page.tsx``web/src/app/admin/page.tsx`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 AI 聊天模块。
## Work Log - 需求开发(ID: 304415118593098042,家庭作业菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098042`(标题:`[fquiz迁移] 家庭作业 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用题库能力承载家庭作业):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.homework`(标题“家庭作业”,路径 `/admin/homework`,图标 `NotebookPen`,排序 `57`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.homework`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.homework`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.homework`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx` 新增“家庭作业”后台入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/homework/page.tsx`,复用 `question-bank` 页面能力:`export { default } from "../question-bank/page";`,使 `/admin/homework` 可直接承接题目新增、筛选、状态流转与标签管理能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098042 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098042` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限家庭作业模块。
## Work Log - 需求开发(ID: 304415118593098051,编排管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098051`(标题:`[fquiz迁移] 编排管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用现有智能体管理页面承载“编排管理”)
- 后端菜单种子:
- `api/app/services/seed_service.py`
- `admin.agent` 菜单文案与路由迁移为:
- `name`: `编排管理`
- `path`: `/admin/orchestration`
- 保持 `code=admin.agent``permission_code=model.read` 不变,避免扩大权限与接口变更范围。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合新增 `admin.orchestration`(兼容路径迁移后的保护口径)。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合新增 `admin.orchestration`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx`
- 将入口卡片从“智能体管理(/admin/agent)”迁移为“编排管理(/admin/orchestration)”。
- 文案同步调整为“维护编排路由(AGENT)规则…”。
- 新增 `web/src/app/admin/orchestration/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 复用既有模型/路由规则页面能力,承接编排管理能力,确保最小改动闭环。
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098051 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098051` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限编排管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098030`(标题:`[fquiz迁移] 需求管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098030 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 状态流转结果(HTTP 均 200):
- `OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`
- 远端状态确认:
- `/api/project/requirement/get/304415118593098030` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED``updateDate=2026-04-19T01:34:35.470386`)。
- 需求对应能力落点(当前工作区可见):
- 后端需求接口与状态流转:`api/app/api/v1/requirements.py``api/app/services/requirement_service.py`
- 后端菜单与权限:`api/app/services/seed_service.py``admin.requirements`,路径 `/admin/requirements`,权限 `requirement.read`admin 默认菜单绑定)
- 菜单保护:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx`(受保护菜单含 `admin.requirements`
- 前端页面:`web/src/app/admin/requirements/page.tsx``web/src/app/admin/requirements/new/page.tsx``web/src/app/admin/requirements/[id]/page.tsx`
- 后台入口:`web/src/app/admin/page.tsx`(“需求管理”卡片)
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限需求管理模块。
## Work Log - 需求开发(ID: 304415118593098048,题库统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098048`(标题:`[fquiz迁移] 题库统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,完成题库统计菜单迁移落点):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mindmap`(标题“题库统计”,路径 `/admin/mindmap`,图标 `ChartBar`,排序 `51`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定顺序中补齐 `admin.mindmap`(位于 `admin.requirements``admin.schedule` 之间)。
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 新增“题库统计”入口卡片,路径 `/admin/mindmap`,权限可见性:`question_bank.read | question_bank.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098048 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限题库统计模块。
## Work Log - 需求开发(ID: 304415118593098039Git管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098039`(标题:`[fquiz迁移] Git管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用既有需求能力承载 Git 管理):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.git_desktop`(标题“Git管理”,路径 `/admin/git-desktop`,图标 `GitBranch`,排序 `50`,权限 `requirement.read`)。
- `admin` 角色默认菜单绑定加入 `admin.git_desktop`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.git_desktop`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.git_desktop`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx` 新增“Git管理”后台入口卡片(权限:`requirement.read`)。
- 新增 `web/src/app/admin/git-desktop/page.tsx`,复用 `requirements` 页面能力:`export { default } from "@/app/admin/requirements/page";`,使 `/admin/git-desktop` 可直接承接需求列表、状态流转、评论协作能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --action full --requirement-id 304415118593098039 --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限 Git 管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098045`(标题:`[fquiz迁移] 生字本 菜单功能迁移`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 能力落点确认(仓库内已具备):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.vocabulary`(标题“生字本”,路径 `/admin/vocabulary`,权限 `vocabulary.read`)已存在,并已加入 admin 默认菜单绑定。
- 权限 `vocabulary.read` / `vocabulary.manage` 已存在。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.vocabulary`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.vocabulary`
- 前后端页面与接口:
- 前端页面 `web/src/app/admin/vocabulary/page.tsx` 已实现列表检索、新增、编辑、删除。
- 后端接口 `api/app/api/v1/vocabulary.py` 已提供 CRUD 与权限校验。
- 后台入口 `web/src/app/admin/page.tsx` 已有“生字本”卡片(`/admin/vocabulary`)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098045 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 本次处理语义:按“断点重启”回写开发轨迹并闭环完成。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限生字本模块。
## Work Log - 需求开发(ID: 304415118593098063,价格监控菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098063`(标题:`[fquiz迁移] 价格监控 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `price-monitor`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用既有 Token 统计能力承接“价格监控”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.token_usage` 与权限 `model.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案由“Token统计”改为“价格监控”,菜单路由由 `/admin/token-usage` 改为 `/admin/price-monitor`
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“Token统计(/admin/token-usage)”迁移为“价格监控(/admin/price-monitor)”。
- 前端页面路由承接:
- 新增 `web/src/app/admin/price-monitor/page.tsx`
- 通过 `export { default } from "../token-usage/page";` 复用现有 Token 统计页面,实现 `/admin/price-monitor` 与原统计能力一致(查询、模型筛选、趋势与费用展示、加载/空态/错误态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098063 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098063` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“价格监控”,可跳转 `/admin/price-monitor`
- 页面可按时间范围、模型编码筛选并展示请求量、成功率、Token 与费用汇总/趋势。
- 边界场景:
- 未登录访问提示正常;无权限(缺少 `model.read/model.manage`)提示正常。
- 无数据时展示空态,不报错。
- 回归点:
- 原接口 `/api/v1/admin/token-usage/overview` 保持不变;
- 原页面 `/admin/token-usage` 仍可访问(兼容),新菜单路由默认指向 `/admin/price-monitor`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限价格监控模块。
## Work Log - 需求开发(ID: 304415118593098057API测试菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098057`(标题:`[fquiz迁移] API测试 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此脚本执行使用 `--skip-build-gate`;当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用模型测试能力承接 API 测试):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.api_tester`(标题“API测试”,路径 `/admin/api-tester`,图标 `TestTube2`,排序 `63`,权限 `model.read`)。
- `admin` 角色默认菜单绑定加入 `admin.api_tester`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.api_tester`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.api_tester`
- 前端入口与路由迁移:
- 新增 `web/src/app/admin/api-tester/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 直接复用模型管理页中已存在的“冒烟测试 / 对话测试 / 测试记录”能力,承接 API 测试菜单功能。
- `web/src/app/admin/page.tsx` 新增“API测试”后台入口卡片,路由 `/admin/api-tester`,权限可见性 `model.read | model.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098057 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098057` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 API 测试模块。
## Work Log - 需求开发(ID: 304415118593098060,上帝视角菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098060`(标题:`[fquiz迁移] 上帝视角 菜单功能迁移`,来源菜单名称/路由:`diary`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用现有系统日志能力承接“上帝视角”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.diary`(标题“上帝视角”,路径 `/admin/diary`,图标 `Eye`,排序 `57`,权限 `menu.read`)。
- `admin` 角色默认菜单绑定加入 `admin.diary`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.diary`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.diary`
- 前端入口与路由承接:
- 新增 `web/src/app/admin/diary/page.tsx`
- `export { default } from "@/app/admin/syslog/page";`
- 复用系统日志页面能力,承接“上帝视角”菜单(动作筛选、用户筛选、分页、加载/空态/错误态)。
- `web/src/app/admin/page.tsx` 新增“上帝视角”后台入口卡片,路由 `/admin/diary`,权限可见性 `menu.read | menu.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098060 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098060` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“上帝视角”,可跳转 `/admin/diary`
- 页面支持按动作(`action`)与用户(`user_id`)筛选审计日志,并支持分页浏览。
- 边界场景:
- 未登录访问时有登录提示。
- 无权限访问(缺少 `menu.read/menu.manage`)时有权限提示。
- 无数据时展示空态“暂无日志数据”。
- 回归点:
-`/admin/syslog` 页面与 `/api/v1/admin/audit-logs` 接口保持兼容;`/admin/diary` 为新增入口复用,不引入额外接口变更。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限上帝视角模块。
## Work Log - 需求开发(ID: 304415118593098066,分组管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098066`(标题:`[fquiz迁移] 分组管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `group`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`。本次按“断点重启”语义执行完整状态轨迹回写。
- 本次实现(最小改动,复用既有标签能力承接“分组管理”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.tag` 与权限 `question_bank.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案由“标签管理”调整为“分组管理”。
- 菜单路由由 `/admin/tag` 迁移为 `/admin/group`
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“标签管理(/admin/tag)”迁移为“分组管理(/admin/group)”。
- 文案同步为“维护题库分组:检索、重命名、批量解除绑定”。
- 前端页面路由承接:
- 新增 `web/src/app/admin/group/page.tsx`
- `export { default } from "../tag/page";`,复用既有标签管理页面能力承接 `/admin/group`
- `web/src/app/admin/tag/page.tsx`
- 页面文案按迁移语义统一为“分组管理”(标题、提示、按钮反馈、对话框文案、空态文案)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098066 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098066` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“分组管理”入口并可跳转 `/admin/group`
- 页面支持分组检索、重命名、删除(解除关联);
- 权限码 `question_bank.read / question_bank.manage` 控制读写行为。
- 边界场景:
- 未登录访问时提示登录;
- 无权限账号访问显示权限提示;
- 无数据时展示“暂无分组数据”。
- 回归点:
- 既有题库标签接口 `/api/v1/admin/question-bank/tags*` 保持不变;
-`/admin/tag` 页面仍可访问(兼容),新菜单路由默认指向 `/admin/group`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限分组管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098072`(标题:`[fquiz迁移] 待办管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此脚本执行使用 `--skip-build-gate`;当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 能力落点确认(当前工作区已具备,最小改动口径闭环):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.todos`(标题“待办管理”,路径 `/admin/todos`,权限 `todo.read`)已存在。
- `admin` 默认菜单绑定已包含 `admin.todos`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.todos`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.todos`
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已有“待办管理”卡片入口(`/admin/todos`)。
- `web/src/app/admin/todos/page.tsx` 已承载待办完整交互能力(筛选、创建、状态流转、删除与权限拦截)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098072 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限待办管理模块。
## Work Log - 需求开发(ID: 304415118593098069,角色管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098069`(标题:`[fquiz迁移] 角色管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `role`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(当前仓库已具备,满足最小改动复用策略):
- 后端接口与权限:
- `api/app/api/v1/admin.py`
- `GET /api/v1/admin/roles``role.read | role.manage`
- `POST /api/v1/admin/roles``role.manage`
- `PATCH /api/v1/admin/roles/{role_id}``role.manage`
- `DELETE /api/v1/admin/roles/{role_id}``role.manage`
- `GET /api/v1/admin/permissions``role.read | role.manage`
- `GET/PUT /api/v1/admin/roles/{role_id}/menus`(读写分权)
- `api/app/services/seed_service.py`
- 角色权限点已存在:`role.read``role.manage`
- 菜单 `admin.roles` 已存在:标题“角色管理”,路径 `/admin/roles`,权限 `role.read`
- 前端页面与交互:
- `web/src/app/admin/roles/page.tsx`
- 角色列表、创建、编辑、删除、角色-菜单绑定。
- 权限拦截、登录态校验、加载态/错误态/成功提示。
- 订阅 `admin.roles/admin.menus` 主题实现数据刷新。
- `web/src/app/admin/page.tsx`
- 后台首页“角色管理”入口卡片,路由 `/admin/roles`,权限可见性 `role.read | role.manage`
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 已将 `admin.roles` 纳入受保护菜单,避免误删。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098069 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098069` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台可访问“角色管理”菜单并进入 `/admin/roles`
- 支持角色列表查询、创建、编辑、删除。
- 支持权限点绑定与菜单绑定,变更后列表可见。
- 边界场景:
- 未登录访问时提示登录。
-`role.read` 权限时提示无权限。
- 删除受保护角色(如 admin)时后端拒绝并返回错误信息。
- 回归点:
- 用户管理页角色下拉(依赖 `/api/v1/admin/roles`)可继续读取角色列表。
- 菜单管理中 `admin.roles` 仍受保护,不可误删。
## Work Log - 需求开发(ID: 304415118593098081,流程图菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098081`(标题:`[fquiz迁移] 流程图 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `mermaid-mgr`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用 MD 解析能力承接“流程图”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mermaid_mgr`(标题“流程图”,路径 `/admin/mermaid-mgr`,图标 `Workflow`,排序 `54`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.mermaid_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.mermaid_mgr`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.mermaid_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“流程图”后台入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/mermaid-mgr/page.tsx`
- `export { default } from "../mdresolve/page";`
- 复用现有 MD 解析页面能力,承接流程图菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098081 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098081` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“流程图”,可跳转 `/admin/mermaid-mgr`
- 页面支持 Markdown 输入、解析预览、批量导入题库;
- 读写权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 解析无结果或导入失败时展示错误/警告信息。
- 回归点:
-`MD解析` 路由 `/admin/mdresolve` 与接口 `/api/v1/admin/mdresolve/*` 保持可用;
- 菜单管理中 `admin.mermaid_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限流程图模块。
## Work Log - 需求开发(ID: 304415118593098078,试题管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098078`(标题:`[fquiz迁移] 试题管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `exam_mgr` / 路由 `exam`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,统一“题库管理”文案为“试题管理”,保持既有能力与路由不变):
- 后端菜单种子:
- `api/app/services/seed_service.py`
- 菜单 `admin.question_bank` 名称由“题库管理”更新为“试题管理”。
- 保持菜单编码 `admin.question_bank`、路径 `/admin/question-bank`、权限 `question_bank.read` 不变。
- 前端后台首页入口:
- `web/src/app/admin/page.tsx`
- 卡片标题由“题库管理”更新为“试题管理”。
- 卡片描述同步改为“维护试题:题目新增、筛选、状态流转与标签管理。”。
- 前端页面文案:
- `web/src/app/admin/mindmap/page.tsx``/admin/question-bank` 复用页)
- 未登录提示由“题库管理页面”更新为“试题管理页面”。
- 页面标题由“题库管理”更新为“试题管理”。
- 迁移说明由 `question_mgr` 更新为 `exam_mgr`,与来源菜单一致。
- 能力落点确认(当前仓库):
- `web/src/app/admin/question-bank/page.tsx` 仍复用 `../mindmap/page`,试题列表/筛选/编辑/状态/标签能力保持不变。
- 菜单保护未变:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 均包含 `admin.question_bank`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098078 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限试题管理模块。
## Work Log - 需求开发(ID: 304415118593098087MCP管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098087`(标题:`[fquiz迁移] MCP管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `mcp_server` / 路由 `mcp-server`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用模型管理能力承接 MCP 管理):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mcp_server`(标题“MCP管理”,路径 `/admin/mcp-server`,图标 `Server`,排序 `63`,权限 `model.read`)。
- `admin` 角色默认菜单绑定加入 `admin.mcp_server`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.mcp_server`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.mcp_server`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“MCP管理”后台入口卡片(权限:`model.read | model.manage`)。
- 新增 `web/src/app/admin/mcp-server/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 复用现有模型管理页面能力,承接 MCP 管理菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098087 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098087` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“MCP管理”,可跳转 `/admin/mcp-server`
- 页面可执行模型列表、路由规则与密钥管理等既有操作(复用 `models` 页面);
- 权限按 `model.read / model.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 模型/路由为空时页面保持空态可读。
- 回归点:
- 原“编排管理(/admin/orchestration)”与“模型管理(/admin/models)”入口仍可用;
- 菜单管理中 `admin.mcp_server` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 MCP 管理模块。
## Work Log - 需求开发(ID: 304415118593098090,菜单管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098090`(标题:`[fquiz迁移] 菜单管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `menu`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,确认并固化菜单管理迁移落点):
- 能力与菜单落点确认(代码已具备):
- `api/app/services/seed_service.py`
- 菜单 `admin.menus`(标题“菜单管理”,路径 `/admin/menus`,权限 `menu.read`)已在默认菜单与 admin 默认绑定中。
- `web/src/app/admin/page.tsx`
- 后台首页已有“菜单管理”入口卡片,路由 `/admin/menus`
- `api/app/api/v1/admin.py`
- 菜单管理接口完整:`GET/POST /menus``PATCH/DELETE /menus/{id}``GET /menus/tree``GET /me/menus`
- `api/app/services/admin_service.py` + `web/src/app/admin/menus/page.tsx`
- 菜单保护包含 `admin.menus`,可阻止受保护菜单误删。
- `web/src/app/admin/menus/page.tsx`
- 页面能力完整:关键词/状态/排序筛选、统计卡片、新建/编辑 Dialog、删除确认、权限与空态处理。
- 记忆口径补充:
- `MEMORY.md` 的“菜单迁移口径(2026-04-18)”新增“菜单管理”条目,明确沿用 `admin.menus``/api/v1/admin/menus*` 既有能力,不做额外扩改。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098090 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098090` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“菜单管理”并可跳转 `/admin/menus`
- 页面支持菜单列表筛选、创建、编辑、删除与层级父菜单选择;
- 角色菜单树可通过 `/api/v1/admin/menus/tree``/api/v1/admin/me/menus` 正常拉取。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示需 `menu.read/menu.manage`
- 删除受保护菜单(如 `admin.menus`)被拦截并返回错误。
- 回归点:
- 角色菜单绑定接口 `/api/v1/admin/roles/{id}/menus` 可继续与菜单管理页联动;
- `admin.menus` 在前后端受保护名单中持续生效。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限菜单管理模块。
## Work Log - 需求开发(ID: 304415118593098084,知识统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098084`(标题:`[fquiz迁移] 知识统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `knowledge-mastery`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库统计能力承接“知识统计”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.knowledge_mastery`(标题“知识统计”,路径 `/admin/knowledge-mastery`,图标 `BrainCircuit`,排序 `51`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.knowledge_mastery`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.knowledge_mastery`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.knowledge_mastery`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“知识统计”后台入口卡片,路由 `/admin/knowledge-mastery`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/knowledge-mastery/page.tsx`
- `export { default } from "../mindmap/page";`
- 复用现有题库统计页面能力,承接知识统计菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098084 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098084` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“知识统计”,可跳转 `/admin/knowledge-mastery`
- 页面支持按题目状态、难度、题型与标签维度进行统计检索与列表展示;
- 读写权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
-`题库统计` 路由 `/admin/mindmap` 与题库接口 `/api/v1/admin/question-bank*` 保持可用;
- 菜单管理中 `admin.knowledge_mastery` 受保护,不可误删。
## Work Log - 需求开发(ID: 304415118593098075,单词统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098075`(标题:`[fquiz迁移] 单词统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `vocabulary-proficiency`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点核验(仓库内已具备):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.knowledge_mastery` 已配置为“单词统计”,路由 `/admin/vocabulary-proficiency`,权限 `vocabulary.read`
- `admin` 角色默认菜单绑定包含 `admin.knowledge_mastery`
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 的受保护菜单集合均包含 `admin.knowledge_mastery`,可防误删。
- 前端页面与入口:
- `web/src/app/admin/vocabulary-proficiency/page.tsx` 提供词条总量、启用占比、缺失音标/例句、状态分布、首字母 Top12、最近更新列表。
- `web/src/app/admin/page.tsx` 提供“单词统计”入口卡片(`/admin/vocabulary-proficiency`)。
- 路由兼容:
- `web/src/app/admin/knowledge-mastery/page.tsx` 作为兼容导出,转发至 `vocabulary-proficiency` 页面。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098075 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098075` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 记忆口径修正:
- `MEMORY.md` 的“菜单迁移口径”已修正该条为“单词统计”,并与当前代码事实保持一致(`admin.knowledge_mastery -> /admin/vocabulary-proficiency -> vocabulary.read`)。
## Work Log - 需求开发(ID: 304415118593098093,作业监控菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098093`(标题:`[fquiz迁移] 作业监控 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单名 `job_mgr`,来源路由 `job`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库能力承接“作业监控”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.job_mgr`(标题“作业监控”,路径 `/admin/job`,图标 `MonitorCog`,排序 `58`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.job_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.job_mgr`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.job_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“作业监控”后台入口卡片,路由 `/admin/job`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/job/page.tsx`
- `export { default } from "../question-bank/page";`
- 复用既有题库页面能力承接作业监控(列表筛选、状态流转、标签维度查看)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098093 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098093` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“作业监控”,可跳转 `/admin/job`
- 页面可复用题库能力完成作业项筛选、状态流转与标签维度查看;
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
-`试题管理``/admin/question-bank`)与 `家庭作业``/admin/homework`)入口保持可用;
- 菜单管理中 `admin.job_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限作业监控模块。
## Work Log - 需求开发(ID: 304415118593098099,微信小程序菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098099`(标题:`[fquiz迁移] 微信小程序 菜单功能迁移`,状态由回退后的 `OPEN` 重启,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且描述未含反引号路径线索,门禁放宽参数使用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用系统参数能力承载微信小程序配置):
- 后端菜单种子与默认绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.wxapp`(标题“微信小程序”,路径 `/admin/wxapp`,图标 `Smartphone`,权限 `system_param.read`,排序 `47`)。
- `admin` 角色默认菜单绑定加入 `admin.wxapp`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.wxapp`,避免误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.wxapp`
- 前端入口与路由:
- `web/src/app/admin/page.tsx` 新增“微信小程序”入口卡片(权限:`system_param.read | system_param.manage`)。
- 新增 `web/src/app/admin/wxapp/page.tsx``export { default } from "../system-params/page";`,复用系统参数页面能力承接配置维护。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098099 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098099` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限微信小程序模块。
## Work Log - 需求开发(ID: 304415118593098102,知识点管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098102`(标题:`[fquiz迁移] 知识点管理 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `knowledge_point_mgr` / 路由 `knowledge`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用分组管理能力承接“知识点管理”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.knowledge_point_mgr`(标题“知识点管理”,路径 `/admin/knowledge`,图标 `Network`,权限 `question_bank.read`,排序 `55`)。
- `admin` 角色默认菜单绑定加入 `admin.knowledge_point_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.knowledge_point_mgr`,避免菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.knowledge_point_mgr`
- 前端入口与路由:
- `web/src/app/admin/page.tsx` 新增“知识点管理”入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/knowledge/page.tsx``export { default } from "../tag/page";`,复用分组管理页面能力承接知识点检索、重命名与解除关联。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098102 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098102` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“知识点管理”,可跳转 `/admin/knowledge`
- 页面支持知识点(标签)检索、重命名、解除关联(复用分组管理能力);
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
- 原“分组管理”入口 `/admin/group` 保持可用;
- 菜单管理中 `admin.knowledge_point_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限知识点管理模块。
## Work Log - 需求开发(ID: 304415118593098108,定时任务菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098108`(标题:`[fquiz迁移] 定时任务 菜单功能迁移`,优先级 `MEDIUM`,来源菜单 `cron_task_mgr` / 路由 `cron`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py` 已存在菜单 `admin.cron_task_mgr`(标题“定时任务”,路径 `/admin/cron`,权限 `todo.read`),并已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.cron_task_mgr`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.cron_task_mgr`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx` 已存在“定时任务”入口卡片(`/admin/cron`)。
- `web/src/app/admin/cron/page.tsx` 已通过 `export { default } from "@/app/admin/todos/page";` 复用待办管理能力承接定时任务菜单。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098108 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 本次处理语义:按“断点重启”口径回写开发轨迹并闭环完成。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限定时任务模块。
## Work Log - 需求开发(ID: 304415118593098111,知识集管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098111`(标题:`[fquiz迁移] 知识集管理 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `knowledge-set` / 路由 `knowledge-set`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“知识集管理”)
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 复用菜单编码 `admin.files` 与权限 `file.read`(保留原有 `file.manage` 写权限链路),菜单文案改为“知识集管理”,路径改为 `/admin/knowledge-set`,图标调整为 `FolderTree`
- 该菜单已在 `admin` 默认菜单绑定中,保持 `admin.files` 绑定不变。
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页新增“知识集管理”入口卡片,路由 `/admin/knowledge-set`,权限可见性 `file.read | file.manage`
- 前端页面承接:
- 新增 `web/src/app/admin/knowledge-set/page.tsx`
- `export { default } from "../files/page";`
- 直接复用现有文件管理页面能力(挂载点切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098111 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098111` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“知识集管理”并可跳转 `/admin/knowledge-set`
- 页面具备目录浏览、目录创建、上传、重命名、移动、删除、下载能力;
- 权限按 `file.read / file.manage` 分级生效(只读与可管理)。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 无可用挂载点时返回对应错误提示。
- 回归点:
- 既有文件管理后端接口 `/api/v1/admin/files*` 与挂载点索引能力保持不变;
- 菜单管理中 `admin.files` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限知识集管理模块。
## Work Log - 需求开发(ID: 304415118593098114,提示词管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098114`(标题:`[fquiz迁移] 提示词管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `prompts` / 路由 `prompt`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用系统消息能力承接“提示词管理”)
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保持菜单编码 `admin.system_message` 与权限 `system_message.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案从“系统消息”迁移为“提示词管理”,路由从 `/admin/system-message` 迁移为 `/admin/prompt`
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“系统消息(/admin/system-message)”迁移为“提示词管理(/admin/prompt)”。
- 卡片说明文案同步为“复用系统消息能力维护提示词内容、等级、有效期与发布状态”。
- 前端页面承接:
- 新增 `web/src/app/admin/prompt/page.tsx`
- `export { default } from "../system-message/page";`
- 复用既有系统消息管理页面,直接承接提示词管理列表检索、新增编辑删除、状态流转与有效期维护能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098114 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098114` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“提示词管理”入口并可跳转 `/admin/prompt`
- 提示词管理页面支持列表检索、新增/编辑/删除、等级与状态切换、有效期维护;
- 权限 `system_message.read / system_message.manage` 正常控制读写。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 空列表展示空态文案。
- 回归点:
- 既有接口 `/api/v1/admin/system-messages*` 与数据模型 `system_messages` 不变;
- 菜单管理中 `admin.system_message` 继续受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限提示词管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098105`(标题:`[fquiz迁移] 队列管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `queue_mgr` / 路由 `jobqueue`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用待办能力承接“队列管理”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.queue_mgr`(标题“队列管理”,路径 `/admin/jobqueue`,图标 `ListTodo`,权限 `todo.read`,排序 `53`)。
- `admin` 角色默认菜单绑定加入 `admin.queue_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.queue_mgr`,避免菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.queue_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“队列管理”入口卡片,路由 `/admin/jobqueue`,权限可见性 `todo.read`
- 新增 `web/src/app/admin/jobqueue/page.tsx`
- `export { default } from "@/app/admin/todos/page";`
- 复用现有待办管理页面能力承接队列任务清单。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098105 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098105` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限队列管理模块。
## Work Log - 需求开发(ID: 304415118593098123,脚本管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098123`(标题:`[fquiz迁移] 脚本管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `script_mgr` / 路由 `script`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用待办能力承接“脚本管理”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.cron_task_mgr`、路由 `/admin/cron` 与权限 `todo.read` 不变;菜单文案由“定时任务”统一为“脚本管理”。
- 前端后台入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“定时任务(/admin/cron)”迁移为“脚本管理(/admin/cron)`,说明文案同步改为脚本任务清单语义。
- 页面能力承接(已有能力沿用):
- `web/src/app/admin/cron/page.tsx` 继续 `export { default } from "@/app/admin/todos/page";`,复用待办管理能力承接脚本任务列表、筛选、状态流转与负责人协作。
- 菜单保护(已有能力沿用):
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx``admin.cron_task_mgr` 受保护配置保持不变,避免被菜单管理误删。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098123 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- 脚本返回 `finalStatusPlanned=COMPLETED``trajectory` 各阶段写回 `httpStatus=200`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限脚本管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098117`(标题:`[fquiz迁移] 模型管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `llmmodel` / 路由 `llmmodel`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 菜单 `admin.models` 已配置为“模型管理”,路径 `/admin/models`,权限 `model.read`,并已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 的受保护菜单集合均包含 `admin.models`,可防误删。
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已存在“模型管理”入口卡片,路由 `/admin/models`
- `web/src/app/admin/models/page.tsx` 已承载模型管理完整能力:模型列表/检索、创建编辑、状态流转、路由规则、密钥轮换、健康检查、冒烟测试与对话测试。
- 记忆口径补充:
- `MEMORY.md` 的“菜单迁移口径(2026-04-18)”新增“模型管理”条目,明确沿用 `admin.models``models` 页面既有能力,不做额外扩改。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098117 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098117` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限模型管理模块。
## Work Log - 需求开发(ID: 304415118593098096,历史答卷菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098096`(标题:`[fquiz迁移] 历史答卷 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `history` / 路由 `history`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库能力承接“历史答卷”)
- 后端菜单能力(已存在,沿用):
- `api/app/services/seed_service.py`
- 菜单 `admin.history` 已配置为“历史答卷”,路径 `/admin/history`,权限 `question_bank.read`,并已加入 `admin` 角色默认菜单绑定。
- 菜单保护补齐:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.history`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.history`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“历史答卷”后台入口卡片,路由 `/admin/history`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/history/page.tsx`
- `export { default } from "../question-bank/page";`
- 复用既有题库页面能力承接历史答卷列表查询/筛选与状态管理。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098096 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098096` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“历史答卷”,可跳转 `/admin/history`
- 页面复用题库管理能力完成列表查询、筛选与状态管理;
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 无数据时展示空态,不报错。
- 回归点:
-`试题管理` 路由 `/admin/question-bank` 与相关接口能力保持可用;
- 菜单管理中 `admin.history` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限历史答卷模块。
## Work Log - 需求开发(ID: 304415118593098138,百度网盘菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098138`(标题:`[fquiz迁移] 百度网盘 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `baidu_pan` / 路由 `baidu-pan`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“百度网盘”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.baidu_pan`
- `name`: `百度网盘`
- `path`: `/admin/baidu-pan`
- `icon`: `Cloud`
- `permission_code`: `file.read`
- `admin` 角色默认菜单绑定加入 `admin.baidu_pan`,保持管理员可见。
- 菜单保护补齐:
- `api/app/services/admin_service.py`
- 后端受保护菜单集合加入 `admin.baidu_pan`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx`
- 前端受保护菜单集合加入 `admin.baidu_pan`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx`
- 新增后台首页卡片“百度网盘”,路由 `/admin/baidu-pan`,可见性 `file.read | file.manage`
- 新增 `web/src/app/admin/baidu-pan/page.tsx`
- `export { default } from "../files/page";`
- 复用现有文件管理页面能力承载百度网盘功能(挂载切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098138 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- 脚本返回:`finalStatusPlanned=COMPLETED`,且 `trajectory` 各阶段写回 `httpStatus=200`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“百度网盘”,可跳转 `/admin/baidu-pan`
- 页面可执行目录浏览、创建目录、上传、重命名、移动、删除与下载;
- 权限按 `file.read / file.manage` 生效,topic `admin.files` 刷新链路保持可用。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示需 `file.read`
- 目录为空时展示空态,不报错。
- 回归点:
- 既有“知识集管理(/admin/knowledge-set)”能力保持可用;
- 菜单管理中 `admin.baidu_pan``admin.files` 均受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限百度网盘模块。
## Work Log - 需求开发(ID: 304415118593098126,文件识别菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098126`(标题:`[fquiz迁移] 文件识别 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `filedetector` / 路由 `filedetector`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“文件识别”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.filedetector`
- `name`: `文件识别`
- `path`: `/admin/filedetector`
- `icon`: `FileSearch2`
- `permission_code`: `file.read`
- `admin` 角色默认菜单绑定加入 `admin.filedetector`,保持管理员可见。
- 菜单保护补齐:
- `api/app/services/admin_service.py`
- 后端受保护菜单集合加入 `admin.filedetector`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx`
- 前端受保护菜单集合加入 `admin.filedetector`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx`
- 新增后台首页卡片“文件识别”,路由 `/admin/filedetector`,可见性 `file.read | file.manage`
- 新增 `web/src/app/admin/filedetector/page.tsx`
- `export { default } from "../files/page";`
- 复用现有文件管理页面能力承载文件识别菜单交互(挂载切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098126 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098126` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“文件识别”,可跳转 `/admin/filedetector`
- 页面可执行目录浏览、创建目录、上传、重命名、移动、删除与下载;
- 权限按 `file.read / file.manage` 生效,topic `admin.files` 刷新链路保持可用。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示需 `file.read`
- 目录为空时展示空态,不报错。
- 回归点:
- 既有“知识集管理(/admin/knowledge-set)”与“百度网盘(/admin/baidu-pan)”能力保持可用;
- 菜单管理中 `admin.filedetector``admin.baidu_pan``admin.files` 均受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限文件识别模块。
## Work Log - 需求开发(ID: 304415118593098126,文件识别菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098126`(标题:`[fquiz迁移] 文件识别 菜单功能迁移`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 能力落点确认(仓库内已具备,最小改动策略,无新增代码改动):
- 后端菜单种子:`api/app/services/seed_service.py`
- 菜单 `admin.filedetector` 已存在(标题“文件识别”,路径 `/admin/filedetector`,权限 `file.read`)。
- 已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.filedetector`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.filedetector`
- 前端页面与入口:
- `web/src/app/admin/filedetector/page.tsx` 已通过 `export { default } from "../files/page";` 复用文件管理能力。
- `web/src/app/admin/page.tsx` 已存在“文件识别”入口卡片并指向 `/admin/filedetector`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098126 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 本需求功能在本仓库已完成迁移,本次为按技能流程断点重启/闭环回写状态,未新增业务代码变更。
## Work Log - 需求开发(ID: 304415118593098129,热搜菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098129`(标题:`[fquiz迁移] 热搜 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备,最小改动策略)
- 后端菜单与默认绑定:
- `api/app/services/seed_service.py`
- 菜单 `admin.hot_search` 已存在(标题“热搜”,路径 `/admin/hot-search`,权限 `menu.read`)。
- `admin` 角色默认菜单绑定已包含 `admin.hot_search`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.hot_search`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.hot_search`
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已存在“热搜”后台入口卡片(`/admin/hot-search`)。
- `web/src/app/admin/hot-search/page.tsx` 已通过 `export { default } from "../data-query/page";` 复用数据查询入口能力。
- `web/src/app/admin/data-query/page.tsx` 已复用系统日志页(`syslog`)承接检索交互。
- 后端热搜能力底座:
- 路由:`api/app/api/v1/hot_search.py``/api/v1/admin/hot-search`)。
- 服务:`api/app/services/hot_search_service.py`(热搜记录检索、关注主题增删改查与默认样例数据)。
- 模型/Schema`api/app/models/hot_search.py``api/app/schemas/hot_search.py`
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098129 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动;技能脚本 `changedFiles` 为工作区整体视图,不仅限热搜模块。
- 已同步更新长期记忆 `MEMORY.md`:补充 `热搜` 菜单迁移口径(入口复用 + 后端能力底座)。
2026-04-23 09:41:54 +08:00
## Work Log - Radix 菜单改造(Phase A + Phase B
- 背景:
- 按需求“先落地 Phase A + Phase B”推进后台菜单交互改造,目标是在不改接口契约的前提下统一菜单交互形态。
- 执行策略:最小改动,仅替换前端交互承载组件,不调整既有业务逻辑与权限判断。
- 本次改动:
- Phase A(后台壳层菜单)
- `web/src/app/admin/layout.tsx`
- 引入 `DropdownMenu`
- 左侧菜单改为 `md` 及以上显示;移动端新增“菜单”下拉入口,基于 `menuTree` 扁平化列表展示可访问菜单项。
- 顶部账号区将“返回首页/退出登录”按钮收口为“账号”下拉菜单。
- Phase B(操作列统一)
- 新增 `web/src/components/row-action-menu.tsx`
- 封装基于 `@radix-ui/themes` 的通用行操作下拉组件 `RowActionMenu`
- `web/src/app/admin/users/page.tsx`
- 将“启用/禁用、改密码、删除”并排按钮改为 `RowActionMenu`
- `web/src/app/admin/requirements/page.tsx`
- 将“领取、开始处理/标记完成、删除”操作改为 `RowActionMenu`,保留原状态流转与删除确认逻辑。
- `web/src/app/admin/menus/page.tsx`
- 将“编辑/删除”操作改为 `RowActionMenu`,保留受保护菜单删除拦截逻辑。
- 验证:
- `npm run build:web`:通过(Next.js 16TypeScript 阶段通过,页面静态生成完成)。
- `npm run lint:web`:失败,存在仓库既有问题(非本次改动引入):
- `web/src/app/admin/hot-search/page.tsx``react-hooks/set-state-in-effect``react-hooks/exhaustive-deps`
- `web/src/app/admin/jwt-generator/page.tsx``react-hooks/preserve-manual-memoization`
- `web/src/app/admin/life-countdown/page.tsx``react-hooks/set-state-in-effect`
- `web/src/app/admin/password/page.tsx``react-hooks/exhaustive-deps`
- 风险与影响:
- 行操作从直出按钮改为二次点击菜单,短期用户习惯需要适配。
- 移动端后台导航改为下拉入口后,首屏更紧凑;但需要依赖菜单数据加载成功才可展开跳转项。