Files
fquiz/memory/2026-04-22.md
T
2026-04-23 09:41:54 +08:00

321 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Work Log - 外部 PostgreSQL 连接切换(2026-04-22
- 背景:按“改成连外部 PG 库”要求,将 API 默认数据库连接从 compose 内 `db` 服务切换为外部 PostgreSQL,并保留本地 `db` 容器为可选能力。
- 本次改动(最小闭环):
- `api/app/core/config.py`
- 新增 `DB_HOST/DB_PORT/DB_NAME/DB_SCHEMA/DB_USERNAME/DB_PASSWORD` 配置项。
- `DATABASE_URL` 改为可选覆盖项;未设置时自动由 `DB_*` 组装 PostgreSQL DSN。
- `api/app/core/database.py`
- 统一使用 `settings.resolved_database_url` 建连。
- PostgreSQL 场景注入 `options=-csearch_path=<DB_SCHEMA>`,对齐 `currentSchema` 语义。
- `docker-compose.yml`
- `api` 移除对 `db` 的强依赖(不再 `depends_on db`)。
- `api` 注入 `DB_*` 外部库环境变量,`DATABASE_URL` 作为可选覆盖。
- `db` 服务改为 `profiles: [local-db]`,默认不启动。
- `.env.example`
- 数据库示例变量切换为外部库口径(含 `DB_*`)。
- `README.md`
- 更新 compose 启动说明:默认外部库;本地 DB 需显式 `--profile local-db`
- 验证:
- `python3 -m py_compile api/app/core/config.py api/app/core/database.py` -> `py_compile_ok`
- `docker compose config` -> `compose_config_ok`,解析结果含 `DB_HOST/DB_PORT/DB_NAME/DB_SCHEMA/DB_USERNAME``DATABASE_URL` 允许为空覆盖。
- 风险与影响:
- 默认 `docker compose up --build -d` 不再自动启动本地 DB;需要本地库时必须显式启用 `local-db` profile。
- 若外部库网络不通或凭据错误,API 启动后会因数据库不可达报错;可通过设置 `DATABASE_URL` 快速回退到其他连接串。
## Work Log - 登录页动效改造(2026-04-22
- 背景:用户要求登录页增强动效,增加“动态小怪兽 + 眼睛跟随鼠标 + 输入密码时挪开视线”的交互。
- 本次改动(最小闭环,仅改前台首页):
- `web/src/app/page.tsx`
- 保留既有登录/注册提交链路(`login/register`)、记住密码逻辑与错误处理,不改接口契约。
- 新增怪兽视线状态:`gaze` + `monsterRef` + `pointermove` 监听,实现眼球跟随鼠标。
- 新增密码聚焦状态:`passwordFocused`;密码输入框 `onFocus/onBlur` 驱动怪兽“挪开视线”(瞳孔偏移 + 眼睑下落 + 身体倾斜)。
- 重做未登录页视觉:浮动渐变背景、怪兽悬浮动画、阴影脉冲动画,并保持桌面/移动端自适应布局。
- 验证:
- `cd web && npx eslint src/app/page.tsx` -> 通过(0 error)。
- `npm run lint:web` -> 失败(仓库已有历史问题,集中在 `admin/hot-search``admin/jwt-generator``admin/life-countdown`,与本次登录页改动无关)。
- 风险与影响:
- 本次改动将动画样式内联在 `web/src/app/page.tsx``style jsx` 中,后续若首页风格继续扩展,建议再抽离到独立样式模块以降低单文件复杂度。
## Work Log - 前端组件库从 Radix UI 迁移到 Ant Design2026-04-22
- 背景:按“弃用 Radix UI,改成 Ant Design”要求,前端在不改业务逻辑前提下完成组件层迁移。
- 本次改动(最小闭环):
- 依赖迁移:
- `web/package.json` 移除 `@radix-ui/themes``@radix-ui/react-dialog``@radix-ui/react-select`
- 新增 `antd` 依赖;根 `package-lock.json` 同步更新。
- 兼容层落地:
- 新增 `web/src/components/ui-antd.tsx`,提供 `Button/Card/Flex/Text/Heading/TextField/TextArea/Select/Dialog/DropdownMenu/Callout/Table/Checkbox/Theme` 兼容导出,底层改由 Ant Design 承接。
- 新增 `web/src/types/antd.d.ts`(当前安装源下 `antd` 包不含 `.d.ts` 时的类型声明兜底)。
- 批量替换:
- `web/src/app/**``web/src/components/row-action-menu.tsx``@radix-ui/themes` 导入统一替换为 `@/components/ui-antd`
- `web/src/app/layout.tsx` 移除 `@radix-ui/themes/styles.css`,改为 `antd/dist/reset.css``Theme` 改由兼容层提供。
- 验证:
- `npm run build:web` -> 通过(Next.js build + TypeScript + 静态页面生成全部成功)。
- 风险与影响:
- 兼容层采用“Radix API 形态 + AntD 实现”策略,短期可稳定过渡;后续若需发挥 AntD 原生能力(如 Table 高级功能、Form 生态),建议分阶段把页面改为直接使用 AntD 原生 API,逐步下线兼容层。
## Work Log - 前端依赖残留清理(2026-04-22
- 背景:用户要求“清理”组件库迁移后的残留依赖。
- 本次处理:
- 清理校验范围统一为源码导入 + `web/package.json` + 根/子锁文件。
- `web/package-lock.json` 已重新对齐 `web/package.json`,移除 `@radix-ui/*` 残留并保留 `antd` 依赖树。
-`package-lock.json` 未检出 `@radix-ui/*` 残留。
- 已删除本地 `node_modules``web/node_modules`,避免此前安装异常产生的脏依赖目录影响后续排查。
- 验证:
- `rg -n "@radix-ui/..." web/src web/package.json web/package-lock.json package-lock.json` 无命中。
- 说明:
- 当前环境下多次 `npm install` 出现 `TAR_ENTRY_ERROR ENOENT`(Next 解包阶段),属于本地依赖安装层异常,不影响仓库内代码与锁文件的残留清理结论。
## Work Log - 需求管理兼容老工程表与逻辑(2026-04-22)
- 背景:按“用老工程 `quiz` 的需求表结构与流程逻辑改造 `fquiz`”要求,目标是在保留现有 `/api/v1/requirements` 可用的前提下,切换底层到老表并补齐老接口兼容。
- 本次改动(最小闭环):
- ORM 表结构改造(对齐老工程):
- `api/app/models/requirement.py`
- `Requirement` 主表由 `requirements` 切换为 `project_requirement`
- 字段改为老口径:`title/project_name/git_url/branch/descr/result_msg/progress_percent/status/priority/create_date/create_user/update_date/update_user`
- 生命周期事件表切到 `project_requirement_log``RequirementEvent`)。
- 保留 `requirement_comments` 作为现有 API 注释能力的兼容扩展,外键改指向 `project_requirement.id`
- 服务层逻辑改造(参考老工程):
- `api/app/services/requirement_service.py`
- 状态集改为老口径:`PENDING_ANALYSIS/PENDING_REVIEW/PENDING_REVISION/OPEN/IN_PROGRESS/COMPLETED/CLOSED`
- 兼容映射:`CANCELLED -> CLOSED`
- 进度规则对齐老逻辑:`COMPLETED=100``PENDING_ANALYSIS/PENDING_REVIEW/PENDING_REVISION/OPEN=0`;其余区间归一化到 `0-100`
- `/api/v1/requirements` 仍可用:序列化层将老表字段映射回现有前端字段(`description<-descr``source<-git_url``module_name<-branch` 等)。
- 事件列表改读 `project_requirement_log`,并将 `before_descr/after_descr/remark` 投影为 `payload_json`
- 新增 legacy 业务函数:`search/get/pending/update_status/analyze/review/lifecycle/history-options`
- 旧接口兼容层新增:
- 新增 `api/app/api/project_requirement.py`,提供:
- `POST /api/project/requirement/search`
- `GET /api/project/requirement/get/{id}`
- `GET /api/project/requirement/pending`
- `POST /api/project/requirement/{id}/status`
- `POST /api/project/requirement/{id}/analyze`
- `POST /api/project/requirement/{id}/review`
- `GET /api/project/requirement/{id}/lifecycle`
- `GET /api/project/requirement/history-options`
- `api/app/api/router.py` 改为组合路由:保留 `/api/v1/*`,并额外挂载 `/api/project/requirement/*`
- 前端类型与状态枚举兼容:
- `web/src/types/auth.ts``RequirementStatus` 新增 `PENDING_REVIEW/CLOSED``RequirementEvent.id` 改为 `string``RequirementSummary` 补充 `result_msg/progress_percent/git_url/branch`
- `web/src/app/admin/requirements/page.tsx`
- `web/src/app/admin/requirements/new/page.tsx`
- `web/src/app/admin/requirements/[id]/page.tsx`
- 状态文案/选项新增 `PENDING_REVIEW``CLOSED`;详情页状态流转映射同步老逻辑。
- 验证:
- `python3 -m compileall api/app/services/requirement_service.py api/app/api/project_requirement.py api/app/models/requirement.py api/app/schemas/requirement.py api/app/api/router.py` -> 通过。
- `npm --workspace web exec -- eslint src/app/admin/requirements/page.tsx src/app/admin/requirements/new/page.tsx src/app/admin/requirements/[id]/page.tsx src/types/auth.ts` -> 通过。
- `npm run -s lint:web` -> 失败(仓库既有问题:`hot-search/jwt-generator/life-countdown` 等页面,非本次改造引入)。
- 运行态接口自检未执行:当前环境缺少 `fastapi` 运行依赖(`ModuleNotFoundError: fastapi`),因此未做本地启动路由验证。
- 风险与影响:
- 该改造面向“老表兼容”,若数据库中同时存在新旧两套需求表,后续数据归一需额外迁移策略。
- 由于老表无显式 `assignee/reviewer/due_at` 字段,`/api/v1/requirements` 中对应字段目前为兼容占位(多数返回 `null`)。
- `project_requirement_log` 在历史库中若字段口径有差异(例如时间列名或类型差异),需按实际库结构微调 ORM 映射。
- 增补兼容接口:`POST /api/project/requirement/{id}/design`(对应老工程 DESIGN 流程,保持 `PENDING_ANALYSIS` 并写入生命周期日志)。
## Work Log - 待办管理按 quiz 表与页面重构(2026-04-22
- 背景:按“改用 quiz 的表,照抄 quiz 逻辑和页面”要求,对 `fquiz` 待办模块做整链路重构(后端表结构/状态机/API + 前端页面交互)。
- 本次改动(最小闭环):
- 后端表结构与字段口径对齐 `quiz`
- `api/app/models/todo.py`
- 表名由 `todos` 改为 `todo`
- 主键改为 32 位 hex 字符串(`uuid4().hex`)。
- 字段切换为 `title/descr/status/priority/start_time/due_date/expire_time/calendar_event_id/create_date/create_user/update_date/update_user`
- 索引对齐:`idx_todo_status/idx_todo_priority/idx_todo_due_date/idx_todo_expire_time`
- 后端 schema 与服务逻辑重构:
- `api/app/schemas/todo.py`
- 状态改为 `SCHEDULED/IN_PROGRESS/COMPLETED/CANCELLED/EXPIRED`
- 优先级改为 `LOW/MEDIUM/HIGH`
- 请求/响应字段改为 quiz 风格(`descr/start_time/due_date/expire_time`)。
- 新增 `TodoMindMapInitResponse`
- `api/app/services/todo_service.py`
- 列表查询改为 quiz 逻辑:按当前登录用户名过滤 `create_user`,支持 `title/status/priority`,并支持分页参数 `page_num/page_size`
- 新增 owner 校验(非创建人不可读写删改)。
- 新增 `complete_todo``init_todo_mindmap`
- 保留/兼容 `transition_todo`,状态流转规则切换到新状态机。
- 后端路由补齐:
- `api/app/api/v1/todos.py`
- 列表接口支持 `title/status/priority/page_num/page_size`(兼容 `keyword`)。
- 新增 `POST /api/v1/todos/{todo_id}/complete`
- 新增 `POST /api/v1/todos/{todo_id}/init-mindmap`
- 前端类型与页面重构:
- `web/src/types/auth.ts`
- `TodoStatus/TodoPriority/TodoSummary` 改为 quiz 字段与状态口径。
- `web/src/app/admin/todos/page.tsx`
- 页面按 quiz 交互重写:默认筛选 `SCHEDULED`、查询/重置、分页、新增、编辑、详情、完成、删除、分析(init-mindmap)。
- 状态与优先级中文标签、完成态/过期态禁用“完成”按钮,行为与 quiz 页面一致。
- 验证:
- `python3 -m py_compile api/app/models/todo.py api/app/schemas/todo.py api/app/services/todo_service.py api/app/api/v1/todos.py` -> 通过。
- `cd web && npx eslint src/app/admin/todos/page.tsx src/types/auth.ts` -> 通过。
- 风险与影响:
- 表名从 `todos` 切到 `todo`,若现网已落 `todos` 数据,需做数据迁移或并行兼容策略;当前实现按“以 quiz 表为准”直接切换。
- `init-mindmap` 当前仅返回初始化结构(fquiz 目前无独立 mindmap 存储与编辑链路),页面侧做成功反馈,不做跳转编辑。
## Work Log - 思维导图按 quiz 表与逻辑落地(2026-04-22
- 背景:按“用老工程表,参考老工程逻辑改造当前工程思维导图功能”要求,将 `fquiz``/admin/mindmap` 从题库统计复用页切回独立思维导图模块。
- 本次改动(最小闭环):
- 后端模型与路由新增:
- `api/app/models/mind_map.py`
- 新增老工程口径主表 `mind_map`(字段:`id/map_name/descr/map_data/create_date/create_user/update_date/update_user`)。
- 索引对齐:`idx_mind_map_name``idx_mind_map_create_date`
- `api/app/schemas/mind_map.py`
- 新增 `MindMapQueryRequest/MindMapCreateRequest/MindMapBasicInfoUpdateRequest/MindMapDataUpdateRequest`
- 新增 `MindMapSummary/MindMapPageResponse`
- `api/app/services/mind_map_service.py`
- 新增 search/get/create/update-basic-info/update-data/delete 业务逻辑。
- 新增 AI 流式生成:`stream_generate_mind_map`,输出 `[PARSE_RESULT]` + `[MINDMAP]{json}` 标记。
- 新增初始化模板构造:`build_initial_mind_map_data(title)`
- `api/app/api/v1/mind_map.py`
- 新增接口:
- `POST /api/v1/mindmap/search`
- `GET /api/v1/mindmap/get/{id}`
- `POST /api/v1/mindmap/create`
- `PUT /api/v1/mindmap/update-basic-info`
- `PUT /api/v1/mindmap/update-data`
- `DELETE /api/v1/mindmap/delete/{id}`
- `GET /api/v1/mindmap/generate/stream`
- 读接口权限:`question_bank.read | question_bank.manage`
- 写接口权限:`question_bank.manage`
- `api/app/api/router.py``api/app/core/database.py``api/app/models/__init__.py`
- 注册 `mind_map` 模块与路由,确保启动建表与路由生效。
- Todo 联动改造:
- `api/app/services/todo_service.py`
- `init_todo_mindmap` 从“仅返回初始化 JSON”改为“真实落库到 `mind_map`”:
- 若同 `todo.id` 的导图存在则直接返回;
- 不存在则按老逻辑以 `todo.id` 创建导图并返回。
- `web/src/app/admin/todos/page.tsx`
- `分析` 后改为跳转 `/admin/mindmap/edit/{id}`,与老工程链路一致。
- 前端页面切换为独立思维导图:
- `web/src/app/admin/question-bank/page.tsx`
- 固化为原题库页面实现(不再从 `../mindmap/page` 复用导出)。
- `web/src/app/admin/mindmap/page.tsx`
- 改为思维导图列表页:查询、分页、新建、编辑基础信息、删除、进入绘图页。
- `web/src/app/admin/mindmap/_components/mindmap-editor.tsx`
- 新增编辑器:基础信息编辑、JSON 编辑、树预览、保存、导出 JSON/Markdown、AI 流式生成。
- `web/src/app/admin/mindmap/edit/page.tsx`
- `web/src/app/admin/mindmap/edit/[id]/page.tsx`
- 新增新建/编辑路由承载页。
- `web/src/types/auth.ts`
- 新增 `MindMapSummary/MindMapListResponse` 类型。
- 菜单与入口文案对齐:
- `api/app/services/seed_service.py`
- `admin.mindmap` 菜单名从“题库统计”改为“思维导图”。
- `web/src/app/admin/page.tsx`
- 后台首页入口文案改为“思维导图”。
- 验证:
- `python3 -m py_compile api/app/models/mind_map.py api/app/schemas/mind_map.py api/app/services/mind_map_service.py api/app/api/v1/mind_map.py api/app/services/todo_service.py api/app/api/router.py api/app/core/database.py api/app/models/__init__.py` -> 通过。
- `python3 -m compileall api/app` -> 通过。
- 前端 lint/build 未完成:
- `npx eslint ...` 受当前环境 npm 依赖解析影响失败(`Cannot find module 'next/dist/compiled/babel-packages'`);
- `npm run build:web` 受当前环境缺失 `next` 可执行文件影响失败(`next: not found`)。
- 风险与影响:
- 当前编辑页采用 JSON 编辑 + 树预览实现,未引入老工程 `mind-elixir` 可视化拖拽编辑能力;若后续需要“节点拖拽/工具栏”体验,需单独引入前端图库并做适配。
- 思维导图分组/标签/向量同步链路(老工程中的 group/tag/vector)本次未迁入,当前闭环聚焦 `mind_map` 主表与 Todo 联动。
## Work Log - Mermaid 按 quiz 表与页面重构(2026-04-22
- 背景:按“改用 quiz 的表,照抄 guiz/quiz 逻辑和页面,重新改造 mermaid 功能”要求,将 `fquiz` 的 Mermaid 模块从“菜单复用 mdresolve”升级为独立 Mermaid 管理与编辑链路。
- 本次改动(最小闭环):
- 后端 Mermaid 接口落地(对齐 quiz 路径语义)
- 新增 `api/app/api/v1/mermaids.py`
- `POST /api/v1/mermaids/diagrams/search`
- `GET /api/v1/mermaids/diagrams/groups`
- `GET /api/v1/mermaids/diagrams/get/{id}`
- `POST /api/v1/mermaids/diagrams/create`
- `PUT /api/v1/mermaids/diagrams/update`
- `DELETE /api/v1/mermaids/diagrams/delete/{id}`
- `PATCH /api/v1/mermaids/diagrams/{id}/data`
- `GET /api/v1/mermaids/diagrams/generate/stream`
- `POST /api/v1/mermaids/diagrams/chat/stream`
- `api/app/api/router.py` 挂载 `mermaids_router``/api/v1`,并新增 legacy 兼容前缀 `/api/mermaids/diagrams/*`(对齐老页面直连习惯)。
- Mermaid schema 兼容 quiz 请求字段
- `api/app/schemas/mermaid.py`:为请求 DTO 增加 `validation_alias`,兼容 `camelCase``snake_case`(如 `diagramName/diagram_name``pageNum/page_num``diagramData/diagram_data``modelName/model_name`)。
- Mermaid service 修正与增强
- `api/app/services/mermaid_service.py`
- 新增 `get_mermaid_diagram_summary`,统一单条详情序列化。
- `create/update/patch-data` 统一复用 summary 返回。
- 修复流式聊天系统提示组装缺陷(历史版本曾出现重复关键字问题)。
- 前端页面重构(按 quiz 交互拆分管理页 + 编辑页)
- `web/src/app/admin/mermaid-mgr/page.tsx`
-`mdresolve` 复用页改为独立 Mermaid 管理页。
- 支持关键字/分组筛选、分页、新建、编辑、删除、详情预览、进入绘图。
- `web/src/app/admin/mermaid-mgr/[id]/page.tsx`
- 新增 Mermaid 编辑路由。
- `web/src/app/admin/mermaid-mgr/_components/mermaid-editor.tsx`
- 左侧 AI 对话流式改图,右侧预览,抽屉源码编辑,保存回写 `PATCH /{id}/data`
- `web/src/components/mermaid-viewer.tsx`
- 新增 Mermaid 预览组件(通过 `mermaid.ink` SVG 渲染,避免本地依赖安装阻塞)。
- 前端类型补齐
- `web/src/types/auth.ts` 新增 Mermaid 相关类型:分组、图表摘要、分页响应、聊天消息。
- 验证:
- `python3 -m py_compile api/app/schemas/mermaid.py api/app/models/mermaid_diagram.py api/app/models/object_group.py api/app/services/mermaid_service.py api/app/api/v1/mermaids.py api/app/api/router.py` -> 通过。
- 前端 ESLint 未执行成功:当前环境 `eslint` 二进制缺失(`sh: 1: eslint: not found`),且 `npm --workspace web install` 过程中出现大量 tarball 校验重试,未形成可用依赖环境。
- 风险与影响:
- Mermaid 预览当前走 `mermaid.ink` 在线渲染;若运行环境外网受限,预览图可能加载失败,但源码编辑与保存链路不受影响。
- 当前工作区存在大量历史未提交改动;本次仅在 Mermaid 相关文件范围内追加改造,未处理既有脏改动。
## Work Log - 日程管理按 quiz 表与页面重构(2026-04-22
- 背景:按“改用 quiz 的表结构,照抄 quiz 的逻辑和页面”要求,把 `fquiz` 的日程管理从“菜单复用 todo 页面”升级为独立日程模块。
- 本次改动(最小闭环):
- 后端表结构与接口落地:
- 新增 `api/app/models/calendar_event.py`,表名 `calendar_event`,字段对齐 quiz`title/descr/status/priority/start_time/end_time/expire_time/all_day/completed_at/todo_id/create_date/create_user/update_date/update_user`
- 新增 `api/app/schemas/calendar_event.py`(查询/创建/更新/分页响应 DTO)。
- 新增 `api/app/services/calendar_event_service.py`(查询、增改删、完成、AI 流式生成、过期自动置 `EXPIRED`、与 todo 双向同步)。
- 新增 `api/app/api/v1/calendar.py`,提供:
- `POST /api/v1/calendar/search`
- `GET /api/v1/calendar/get/{id}`
- `POST /api/v1/calendar/create`
- `PUT /api/v1/calendar/update`
- `DELETE /api/v1/calendar/delete/{id}`
- `POST /api/v1/calendar/{id}/complete`
- `GET /api/v1/calendar/generate/stream`
- `api/app/api/router.py` 挂载 `calendar_router``api/app/models/__init__.py``api/app/core/database.py` 增加 `calendar_event` 模型注册。
- Todo 双向同步补齐:
- `api/app/schemas/todo.py``TodoUpdateRequest/TodoTransitionRequest` 增加 `is_sync` 标记。
- `api/app/services/todo_service.py``create/update/transition/complete/delete` 增加 `syncing` 参数并接入 `calendar_event_service` 同步函数,防止 schedule<->todo 循环调用。
- 前端页面改造:
- `web/src/app/admin/schedule/page.tsx` 从复用导出改为独立页面,实现 quiz 风格年/月/周视图、创建/编辑/删除/完成、AI 流式生成并回填表单。
- 验证:
- `python3 -m compileall api/app/models/calendar_event.py api/app/schemas/calendar_event.py api/app/services/calendar_event_service.py api/app/api/v1/calendar.py api/app/services/todo_service.py api/app/schemas/todo.py api/app/api/v1/todos.py` -> 通过。
- 前端 lint/build 未完全通过环境验证:
- `cd web && npx eslint src/app/admin/schedule/page.tsx src/types/auth.ts` -> 失败(`eslint: not found`)。
- `npm --workspace web install` 持续出现 `next` 解包 `TAR_ENTRY_ERROR ENOENT`,依赖环境未恢复,暂无法给出有效前端构建结论。
- 风险与影响:
- 依赖环境异常会阻断前端 lint/build 验证,但不影响本次后端与页面代码改造落地。
- 当前工作区存在大量历史脏改动;本次仅在日程与 todo 相关范围内追加改造,未触及其余模块。