45 KiB
45 KiB
MEMORY.md - fquiz 工程长期记忆
项目基线
- 当前已完成
fquiz子智能体骨架创建。 - OpenClaw agent id:
fquiz - Workspace:
/root/.openclaw/workspace/fquiz - Agent dir:
/root/.openclaw/agents/fquiz/agent
调度并发口径(程凯指定)
fquiz默认调度并发:maxConcurrency=6。- 供派单技能读取时使用以下固定映射:
targetAgent=fquizdispatchProjectName=fquizmaxConcurrency=6
约定
- 在未明确项目技术栈、目录结构、部署方式前,避免把其他工程(如
quiz/nquiz)的具体规则直接套用到fquiz。 - 后续若
fquiz绑定真实仓库或明确职责,应在此文件补充长期有效口径。 - API 镜像构建阶段支持通过
PIP_INDEX_URL(Secrets/Variables)和PIP_DEFAULT_TIMEOUT(Variables)调优 pip 拉包稳定性;默认索引为https://pypi.org/simple。 web目录用于 Docker 独立构建时,web/package.json与web/package-lock.json必须保持同步;否则web/Dockerfile中的npm ci会因锁文件不一致直接失败(EUSAGE)。
模型管理口径(2026-04-12)
- 模型业务引用键统一使用
code(llm_models.code),name仅用于展示文案。 - 模型状态机固定为:
DRAFT/ENABLED/DISABLED/DEPRECATED,并遵循受限流转规则,禁止任意跳转。 - 路由规则类型固定为:
GLOBAL/CAPABILITY/BUSINESS/AGENT;其中GLOBAL保留 key 为__global__。 - 模型删除前必须做引用检查(至少检查路由规则引用);
ENABLED状态禁止直接删除。 - 密钥默认只保留 hash + masked + fingerprint,不通过 API 返回明文。
文件管理口径(2026-04-12)
- 文件管理一期采用三层模型:
file_storage_backends(后端定义:VFS/S3)file_storage_mounts(挂载点)file_index_entries(目录索引快照)
- 后台 API 入口统一在
/api/v1/admin/files前缀,权限码为:file.read:浏览挂载点和目录列表file.manage:创建目录、删除路径
- 存储驱动抽象位于
api/app/services/storage_driver.py,VFS/S3 必须通过同一工厂分发,避免业务层直接耦合具体存储 SDK。 - VFS 默认根目录由
FILE_VFS_ROOT控制(默认./data/vfs)。
启动与部署稳定性口径(2026-04-12)
- SQLAlchemy 关联加载选项(
selectinload/joinedload)避免在模块导入期以全局常量初始化,优先在函数内惰性构建,防止导入顺序导致 mapper 提前配置失败。 app.models包初始化需预加载全部模型模块,确保字符串关系(如"AuditLog")在启动阶段可解析。- 部署 compose 中 DB 镜像应通过
POSTGRES_IMAGE可配置,默认使用镜像站的 pgvector 镜像(docker.m.daocloud.io/pgvector/pgvector:pg16)。 - 宿主机 DB 暴露端口统一走
POSTGRES_PORT(默认5433),用于规避与宿主机已有 PostgreSQL(常见5432)冲突;容器内连接仍保持db:5432。 - CORS 来源控制采用“双轨配置”:
API_CORS_ORIGINS(精确列表)+API_CORS_ORIGIN_REGEX(正则,可选);API_CORS_ORIGINS支持*和通配符域名并在后端转换为allow_origin_regex。 - GitHub Actions 使用
appleboy/ssh-action部署时,慢网环境需显式设置command_timeout(建议45m)并为docker compose pull增加重试,避免出现Run Command Timeout直接中断发布。 docker compose up -d不会重建build类型服务镜像;本项目web无源码挂载且运行 Next.js 生产构建产物,前端代码变更后需执行docker compose up --build -d web(必要时先docker compose build --no-cache web)。api构建若在拉取docker.m.daocloud.io/library/python:3.11-slim时出现 manifestEOF,优先重试docker compose build api;若持续失败,可在.env覆盖PYTHON_BASE_IMAGE=python:3.11-slim走 Docker Hub 兜底。
前端视觉口径(2026-04-12)
- 后台视觉基线采用
Slate + Indigo(浅色)风格,优先使用web/src/app/globals.css中统一样式类:surface-card/surface-card-mutednotice+notice-error/notice-successbtn-primary/btn-secondary/btn-dangercontroltable-modern/table-head/table-body
- 字体基线:
- 标题:
Space Grotesk - 正文:
Manrope - 等宽:
JetBrains Mono
- 标题:
前端联调口径(2026-04-12)
NEXT_PUBLIC_API_BASE_URL若误配为 loopback(127.0.0.1/localhost),前端运行时会在浏览器端自动改写为“当前页面主机 + 同端口(默认 8000)”,避免公网页面触发 PNA(Private Network Access)阻断。- 认证请求与 WebSocket 连接均统一复用该运行时 API 基址解析逻辑。
前端构建稳定性口径(2026-04-13)
web在 Docker/受限网络环境构建时,避免使用next/font/google(编译期需访问fonts.googleapis.com,网络受限会导致npm run build失败)。- 字体基线应优先采用本地可用字体或仓库内自托管字体(
next/font/local),并通过 CSS 变量维持--font-heading/--font-body/--font-mono约定,减少样式层连锁改动。 web/src/app/layout.tsx应保持无next/font/google依赖,仅通过web/src/app/globals.css的--font-*变量声明字体栈;若后续引入新字体,优先走自托管或运行时回退方案。
前端组件类型兼容口径(2026-04-13)
- 当前依赖组合下,
@heroui/react在仓库内会出现Button/Input等组件导出类型与常见属性(如id/className/onPress)不一致的问题,可能导致next build的 TypeScript 阶段失败。 web/src/components/ui.tsx已改为原生语义封装(button/input/checkbox)并保留现有样式类约定(btn-*、control)作为稳定兜底;同时ListBox/Modal/Table使用 HeroUI 运行时组件 + 宽松类型包装,避免children等声明缺口阻断构建。@heroui/react的Table在当前版本是分层组合组件:Table仅作为外层容器,Table.Header/Body/Row/Column/Cell必须置于Table.Content内部,否则运行时会触发cannot be rendered outside a collection.。- 后续若要恢复 HeroUI 组件能力,先验证依赖版本和类型声明兼容性,再逐页替换,避免再次阻断 Docker 构建。
前端组件栈口径(2026-04-17)
- 前端组件库基线已从
@heroui/react切换到shadcn/ui风格封装 +Radix UIprimitives。 - 当前基础组件位于
web/src/components/ui/,统一通过web/src/components/ui.tsx对外导出(保留@/components/ui入口)。 todos页面已完成首批迁移:筛选/表单选择器使用Radix Select,弹窗使用Radix Dialog,表格使用 shadcn 风格Table语义封装。web依赖口径:新增@radix-ui/react-dialog、@radix-ui/react-select、class-variance-authority、clsx、tailwind-merge;移除@heroui/react。- 后续页面迁移保持“业务逻辑不动,仅替换 UI 组件 API”的最小改动策略,并以
npm run build:web为最终验收门禁。 - 阶段 B(表单控件统一)已覆盖:
/admin/requirements、/admin/requirements/new、/admin/requirements/[id]、/admin/menus、/admin/models、/admin/users;上述页面不再使用原生select/textarea与control样式输入,统一走@/components/ui的Input/Select/TextArea组件。 - 阶段 B 收尾已完成:
/admin/chat的消息输入框已统一为TextArea;当前web/src/app/admin/**已无原生select/textarea与control直连输入写法。 - 阶段 C(弹窗统一)已完成:
/admin/models与/admin/roles的手写遮罩弹窗(fixed inset-0)已统一迁移为@/components/ui的Dialog,并保留原有新建/编辑/关闭与提交行为。 - 在当前
@radix-ui/themes+ TS 配置下,TextField.Root/TextArea的onChange处理函数应显式标注ChangeEvent<HTMLInputElement | HTMLTextAreaElement>;否则next build的 TypeScript 阶段可能出现Parameter implicitly has an 'any' type,且输入/文本域混用时会触发事件类型不兼容。
前端主题口径(2026-04-17)
- 后台主题基线已切换到
Radix Themes:web/src/app/layout.tsx必须注入@radix-ui/themes/styles.css与<Theme ...>根包裹。 - 当前默认主强调色为
indigo(accentColor=\"indigo\");如需换肤优先调整Theme的accentColor,并同步清理页面中的硬编码色值类。 web/src/app/globals.css的语义类(surface-card/btn-*/control/table-*)统一基于 Radix token(--gray-*/--accent-*等)实现;后续新增样式优先复用这些语义类,不再回退硬编码slate/cyan色值。web/src/components/ui/*的样式应优先通过语义类(如dialog-content、select-content、checkbox-control)承接主题,确保后续仅改 token 即可全局换肤。webDocker 构建基于node:alpine时,web/package-lock.json必须保留 musl 可选依赖条目(至少lightningcss-linux-x64-musl、@tailwindcss/oxide-linux-x64-musl);缺失会在next build阶段触发Cannot find module ...musl.node。
登录页与品牌文案口径(2026-04-18)
- 站点品牌标题统一使用
Quiz:至少保持web/src/app/layout.tsx的metadata.title与首页主标题一致。 - 登录页默认不展示
API Base URL,仅保留getApiBaseUrl()在请求链路中的能力(不影响鉴权与 API 调用逻辑)。
登录页动效口径(2026-04-22)
- 登录页主视觉允许使用装饰性动效(如浮动背景与角色动画),但必须保持登录/注册接口调用链路与鉴权行为不变。
- 首页怪兽交互基线:眼睛跟随鼠标,密码输入框聚焦时主动挪开视线(避免“盯着密码输入”观感)。
- 当前实现位于
web/src/app/page.tsx;若后续继续扩展动效,优先抽离样式与展示组件,避免登录业务与视觉代码耦合过深。
AI 聊天口径(2026-04-13)
- 一期聊天入口固定为后台路由
/admin/chat,权限码为chat.use。 - 聊天模型选择规则固定为:
CAPABILITY: chat.default优先,未命中时回退GLOBAL: __global__。 - 仅允许
ENABLED且具备激活密钥记录的模型参与路由命中;若不满足,接口返回 400。 - 运行时真实 Provider Key 不从数据库反解,统一从环境变量
LLM_PROVIDER_API_KEYS注入(支持openai=sk-...或 JSON 字典字符串)。 - 一期模型调用采用非流式 OpenAI-compatible
POST /chat/completions,后续如需流式再扩展 SSE/WS。
前端 Radix 全量化口径(2026-04-18)
web/src/app/**已完成“去语义类 + 组件全量 Radix 化”:不再依赖surface-card/btn-*/control/table-*/notice*/text-muted等自定义语义类。- 页面组件基线统一为
@radix-ui/themes:- 交互:
Button/Checkbox - 输入:
TextField.Root/TextArea/Select.Root - 表格:
Table.Root + Header/Body/Row/ColumnHeaderCell/Cell
- 交互:
- 工程约束更新:
web/src/app下默认不再引入原生button/input/select/textarea/table作为业务 UI(除非有明确无替代场景并单独说明)。 web/src/app/globals.css仅保留基础排版与 Radix token 基线,不再承载语义组件样式层。
前端上传控件类型口径(2026-04-18)
- 在当前
@radix-ui/themes类型定义下,TextField.Root的type联合不包含file。 - 文件上传场景应使用原生
<input type="file">(可配合主题 token 做样式),避免在next build的 TypeScript 阶段触发类型错误。
前台组件选型优先级(程凯指定,2026-04-18)
- 前台页面组件默认优先使用
Radix UI(含@radix-ui/themes与 Radix primitives)。 - 仅当 Radix 体系内没有合适组件时,才使用其他组件方案。
- 引入非 Radix 组件时,优先最小依赖与最小改动,并保持现有主题与交互风格一致。
菜单迁移口径(2026-04-18)
日程管理菜单已升级为独立日程模块:保留菜单admin.schedule(/admin/schedule,权限todo.read),前端由web/src/app/admin/schedule/page.tsx承载年/月/周视图、编辑、完成、AI 生成交互,不再复用todos页面。admin.schedule已加入后端与前端受保护菜单集合,避免在菜单管理中被误删。家庭作业菜单迁移采用最小改动策略:新增菜单admin.homework(/admin/homework,权限question_bank.read),并直接复用question-bank页面能力作为家庭作业承载。admin.homework已加入后端与前端受保护菜单集合,避免在菜单管理中被误删。作业监控菜单迁移采用最小改动策略:新增菜单admin.job_mgr(/admin/job,权限question_bank.read),并由web/src/app/admin/job/page.tsx复用question-bank页面能力承载作业监控交互。admin.job_mgr已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口,避免在菜单管理中被误删。题库统计菜单迁移采用最小改动策略:新增菜单admin.mindmap(/admin/mindmap,权限question_bank.read),并复用现有题库统计承载页面能力。admin.mindmap已加入后端默认菜单绑定与前端后台首页入口,确保菜单可见且可直达。诗词本菜单迁移沿用词条能力:保留菜单编码admin.vocabulary与权限vocabulary.read,菜单文案统一为“诗词本”,默认路由为/admin/poetry,并由web/src/app/admin/poetry/page.tsx复用vocabulary页面实现。价格监控菜单迁移沿用 Token 统计能力:保留菜单编码admin.token_usage与权限model.read,菜单文案统一为“价格监控”,默认路由为/admin/price-monitor,并由web/src/app/admin/price-monitor/page.tsx复用token-usage页面实现。API测试菜单迁移沿用模型测试能力:新增菜单编码admin.api_tester(/admin/api-tester,权限model.read),由web/src/app/admin/api-tester/page.tsx复用models页面承载“冒烟测试/对话测试/测试记录”能力;并已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。模型管理菜单迁移沿用既有模型能力:保留菜单编码admin.models(/admin/models,权限model.read/model.manage),继续由web/src/app/admin/models/page.tsx承载模型台账、状态流转、路由规则、密钥轮换、健康检查与测试能力;并已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。流程图菜单已切回独立 Mermaid 管理能力:菜单编码admin.mermaid_mgr(/admin/mermaid-mgr,权限question_bank.read),前端由web/src/app/admin/mermaid-mgr/page.tsx承载列表/分组/新建编辑删除,编辑页为web/src/app/admin/mermaid-mgr/[id]/page.tsx(AI 流式改图 + 预览 + 保存);后端接口对齐 quiz 路径:/api/v1/mermaids/diagrams/*,并兼容/api/mermaids/diagrams/*legacy 前缀。上帝视角菜单迁移沿用系统日志能力:新增菜单编码admin.diary(/admin/diary,权限menu.read),由web/src/app/admin/diary/page.tsx复用syslog页面承载审计日志查询能力;并已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。待办管理菜单迁移采用最小改动策略:保留菜单编码admin.todos(/admin/todos,权限todo.read),并沿用现有todos页面能力承载待办管理完整交互(筛选、创建、状态流转、删除)。队列管理菜单迁移采用最小改动策略:新增菜单编码admin.queue_mgr(/admin/jobqueue,权限todo.read),并由web/src/app/admin/jobqueue/page.tsx复用todos页面能力承接队列任务清单管理;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。试题管理菜单迁移采用最小改动策略:保留菜单编码admin.question_bank(/admin/question-bank,权限question_bank.read),菜单文案统一为“试题管理”;前端后台首页入口文案同步为“试题管理”,并继续复用现有题库题目管理页面能力(列表、筛选、编辑、状态流转、标签管理)。分组管理菜单迁移沿用标签能力:保留菜单编码admin.tag与权限question_bank.read,菜单文案统一为“分组管理”,默认路由迁移为/admin/group,并由web/src/app/admin/group/page.tsx复用tag页面承载分组检索、重命名与解除关联能力。知识点管理菜单迁移沿用标签能力:新增菜单编码admin.knowledge_point_mgr(/admin/knowledge,权限question_bank.read),并由web/src/app/admin/knowledge/page.tsx复用tag页面承载知识点检索、重命名与解除关联能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。MCP管理菜单迁移沿用模型编排能力:新增菜单编码admin.mcp_server(/admin/mcp-server,权限model.read),并由web/src/app/admin/mcp-server/page.tsx复用models页面承载模型/路由规则管理能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。菜单管理菜单迁移沿用现有后台菜单能力:保留菜单编码admin.menus(/admin/menus)、权限menu.read/menu.manage与前后端 CRUD/树形查询接口(/api/v1/admin/menus*)不变,继续由web/src/app/admin/menus/page.tsx承载菜单筛选、新建、编辑、删除与受保护菜单拦截能力。微信小程序菜单迁移采用最小改动策略:新增菜单编码admin.wxapp(/admin/wxapp,权限system_param.read),并由web/src/app/admin/wxapp/page.tsx复用system-params页面能力承载微信小程序配置项维护。admin.wxapp已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口,确保可见、可达且不被误删。单词统计菜单迁移采用最小改动策略:保留菜单编码admin.knowledge_mastery(/admin/vocabulary-proficiency,权限vocabulary.read),并由web/src/app/admin/vocabulary-proficiency/page.tsx承载词条总量、状态分布、缺失字段与最近更新趋势统计能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。队列管理菜单迁移采用最小改动策略:新增菜单编码admin.queue_mgr(/admin/jobqueue,权限todo.read),并由web/src/app/admin/jobqueue/page.tsx复用todos页面承载队列任务清单能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。提示词管理菜单迁移沿用系统消息能力:保留菜单编码admin.system_message与权限system_message.read/system_message.manage,菜单文案统一为“提示词管理”,默认路由迁移为/admin/prompt,并由web/src/app/admin/prompt/page.tsx复用system-message页面承载提示词内容、等级、有效期与发布状态维护能力。历史答卷菜单迁移采用最小改动策略:保留菜单编码admin.history(/admin/history,权限question_bank.read),并由web/src/app/admin/history/page.tsx复用question-bank页面承载历史答卷查询与管理能力;已加入后端与前端受保护菜单集合与后台首页入口。脚本管理菜单迁移采用最小改动策略:保留菜单编码admin.cron_task_mgr(/admin/cron,权限todo.read),菜单文案统一为“脚本管理”,并继续由web/src/app/admin/cron/page.tsx复用todos页面承载脚本任务清单能力。百度网盘菜单迁移采用最小改动策略:新增菜单编码admin.baidu_pan(/admin/baidu-pan,权限file.read),并由web/src/app/admin/baidu-pan/page.tsx复用files页面承载目录浏览、上传、重命名、移动、删除与下载能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。文件识别菜单迁移采用最小改动策略:新增菜单编码admin.filedetector(/admin/filedetector,权限file.read),并由web/src/app/admin/filedetector/page.tsx复用files页面承载目录浏览、上传、重命名、移动、删除与下载能力;已加入后端与前端受保护菜单集合、admin 默认菜单绑定与后台首页入口。热搜菜单迁移采用最小改动策略:新增菜单编码admin.hot_search(/admin/hot-search,权限menu.read),并由web/src/app/admin/hot-search/page.tsx复用data-query页面承接热搜入口;后端同步提供/api/v1/admin/hot-search记录检索与关注主题能力(api/app/api/v1/hot_search.py+api/app/services/hot_search_service.py+api/app/models/hot_search.py)作为后续独立热搜交互能力底座。
前端主题纯化口径(2026-04-18)
web/src/app/globals.css保持最小化:仅保留 Tailwind 导入与基础全局规则,不再承载字体栈覆盖、Radix token 二次映射、装饰性渐变背景。web/src/app/layout.tsx只负责注入@radix-ui/themes/styles.css与ThemeProvider,不再通过根容器类叠加自定义主题视觉。web/src/app/admin/layout.tsx使用 Radix Themes 组件(Card/Flex/Text/Heading/Button/Callout)组织后台壳层,避免硬编码品牌色光斑与渐变块。web/src/app/**中Button视觉优先通过variant / color / size控制;不再使用长 Tailwind 颜色类拼接按钮主题。
前端菜单交互口径(2026-04-19)
- 后台壳层(
web/src/app/admin/layout.tsx)已采用@radix-ui/themes的DropdownMenu承接菜单交互:- 移动端(
md以下)菜单入口统一为“菜单”下拉,不再直接渲染左侧长列表; - 顶部账号区“返回首页/退出登录”统一收口到“账号”下拉。
- 移动端(
- 后台表格行内“操作”入口推荐统一为下拉菜单形态,优先复用
web/src/components/row-action-menu.tsx,避免页面内重复堆叠小按钮并降低操作列宽度波动。 - Phase B 样板页已落地:
/admin/users、/admin/requirements、/admin/menus;后续页面迁移默认保持“业务逻辑不动,仅替换操作入口承载组件”的最小改动策略。
数据库连接口径(2026-04-23)
- API 默认数据库连接切换为本地 PostgreSQL:优先读取
DATABASE_URL;若未设置则由DB_HOST/DB_PORT/DB_NAME/DB_USERNAME/DB_PASSWORD组装。 - 默认参数口径:
- Docker 内:
DB_HOST=db、DB_PORT=5432、DB_NAME=postgres、DB_USERNAME=fquiz、DB_PASSWORD=fquiz。 - 本机直连(非 Docker):
DB_HOST=127.0.0.1、DB_PORT=5433、DB_NAME=postgres、DB_USERNAME=fquiz、DB_PASSWORD=fquiz。
- Docker 内:
docker compose的db服务已取消local-dbprofile,默认up即启动本地库;api增加depends_on: db (healthy)。DB_SCHEMA通过 PostgreSQLsearch_path注入,语义等价 JDBC 的currentSchema。- API 启动初始化口径:
seed_defaults对本地目标执行;为兼容老表状态约束,初始管理员状态写入值统一为ENABLED(不使用active)。 - 用户表兼容口径:用户主键列对齐旧库
users.user_id,与用户关联的外键统一引用users.user_id(不再引用users.id)。
前端组件栈口径(2026-04-22)
- 组件库基线从
Radix UI切换为Ant Design,web依赖已移除@radix-ui/themes/@radix-ui/react-dialog/@radix-ui/react-select,新增antd。 - 为控制迁移范围,新增兼容层
web/src/components/ui-antd.tsx:对外保持Button/Card/Flex/Text/Heading/TextField/TextArea/Select/Dialog/DropdownMenu/Callout/Table/Checkbox/ThemeAPI 形态,内部使用 AntD 实现。 web/src/app/layout.tsx统一注入antd/dist/reset.css,并通过兼容层Theme提供全局主题 token。- 工程约束更新:
- 页面/组件禁止继续新增
@radix-ui/themes导入; - 优先从
@/components/ui-antd引入 UI 组件; - 新增页面如需 AntD 高级能力,可直接引入
antd,但需保持与现有主题和交互风格一致。
- 页面/组件禁止继续新增
- 兼容说明:
web/src/types/antd.d.ts仅保留antd/dist/reset.css声明,禁止再写declare module "antd";否则会覆盖官方类型并导致Form.useForm<T>等泛型调用在next build的 TypeScript 阶段失败。 web/src/components/ui-antd.tsx作为兼容层时,若自定义type/variant/size/checked等语义,必须先Omit掉对应 AntD 原生同名字段再重定义,否则会触发联合类型冲突并阻断 Docker 构建。
需求管理兼容口径(2026-04-22)
- 需求管理底层表结构已切换为老工程口径:
- 主表:
project_requirement - 生命周期表:
project_requirement_log
- 主表:
fquiz需求模块保持“双接口并行”策略:- 现有前端接口:
/api/v1/requirements* - 老工程兼容接口:
/api/project/requirement/*(search/get/status/analyze/review/lifecycle/history-options/pending)
- 现有前端接口:
思维导图兼容口径(2026-04-22)
- 思维导图已从“题库统计复用页”切回独立模块,后端主表固定为老工程口径
mind_map。 - API 入口统一采用老工程风格路径(挂在
/api/v1下):POST /api/v1/mindmap/searchGET /api/v1/mindmap/get/{id}POST /api/v1/mindmap/createPUT /api/v1/mindmap/update-basic-infoPUT /api/v1/mindmap/update-dataDELETE /api/v1/mindmap/delete/{id}GET /api/v1/mindmap/generate/stream
- Todo 分析链路已恢复老逻辑:
POST /api/v1/todos/{todo_id}/init-mindmap会真实创建/复用mind_map(id=todo_id)并返回导图信息,前端跳转到/admin/mindmap/edit/{id}。 - 当前前端编辑器基线为“JSON 编辑 + 树预览 + AI 流式生成 + JSON/Markdown 导出”;如需老工程
mind-elixir的可视化拖拽编辑,需单独引入并适配 AntD/Next 页面栈。 - 状态机口径对齐老工程:
PENDING_ANALYSIS -> PENDING_REVIEW/PENDING_REVISION/OPEN -> IN_PROGRESS -> COMPLETED/CLOSED;并兼容映射CANCELLED -> CLOSED。 - 优先级口径对齐老工程存储:数据库落库使用大写
LOW/MEDIUM/HIGH;API 层兼容小写输入并向前端返回小写展示值。 - 旧表不包含
assignee/reviewer/due_at等字段,/api/v1/requirements中这些字段当前作为兼容占位返回,后续如需恢复需补扩展表或业务映射策略。 - 老工程兼容接口补充
POST /api/project/requirement/{id}/design,用于需求设计阶段回写(PENDING_ANALYSIS内部闭环)。
待办管理兼容口径(2026-04-22)
- 待办模块已切换到 quiz 表口径:
api/app/models/todo.py使用todo表(非todos),字段为title/descr/status/priority/start_time/due_date/expire_time/calendar_event_id/create_date/create_user/update_date/update_user。 - 状态机与优先级固定为:
- 状态:
SCHEDULED/IN_PROGRESS/COMPLETED/CANCELLED/EXPIRED - 优先级:
LOW/MEDIUM/HIGH
- 状态:
/api/v1/todos查询口径对齐 quiz:默认按当前登录用户create_user过滤,仅返回本人待办;支持title/status/priority/page_num/page_size。- 待办扩展接口口径:
POST /api/v1/todos/{todo_id}/complete:完成待办(置COMPLETED)POST /api/v1/todos/{todo_id}/init-mindmap:创建或复用mind_map(id=todo_id)并返回导图详情
- 前端
web/src/app/admin/todos/page.tsx已按 quiz 交互重构:默认状态筛选SCHEDULED、分页列表、新增/编辑/详情、分析、完成、删除;jobqueue/cron继续复用该页面。
日程管理兼容口径(2026-04-22)
- 日程模块已切换到 quiz 表口径:
api/app/models/calendar_event.py使用calendar_event表,字段为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 固定为:
POST /api/v1/calendar/searchGET /api/v1/calendar/get/{id}POST /api/v1/calendar/createPUT /api/v1/calendar/updateDELETE /api/v1/calendar/delete/{id}POST /api/v1/calendar/{id}/completeGET /api/v1/calendar/generate/stream
- 日程与待办保持双向同步:
- 日程创建/更新/删除/完成会同步到
todo
- 日程创建/更新/删除/完成会同步到
- 待办创建/更新/删除/状态流转会同步到
calendar_event - 通过
is_sync/syncing标记防止递归回环。
日记管理兼容口径(2026-04-23)
admin.diary已从系统日志复用页切换为独立 Diary 模块,后端主表固定为老工程口径diary。- Diary 表字段口径:
id/title/content/diary_date/mood/weather/archived/create_date/create_user/update_date/update_user,并保留create_user维度隔离查询。 - API 入口统一采用老工程风格路径(挂在
/api/v1下):POST /api/v1/diary/searchGET /api/v1/diary/get/{id}POST /api/v1/diary/createPUT /api/v1/diary/updateDELETE /api/v1/diary/delete/{id}POST /api/v1/diary/{id}/archive?archived=...
- 查询逻辑对齐老工程:支持
title/mood/diary_date_start/diary_date_end/archived过滤,排序diary_date DESC, create_date DESC。 - 当前权限沿用兼容口径:
- 读:
menu.read | menu.manage - 写:
menu.manage后续若需细粒度可拆分diary.read/diary.manage。
- 读:
登录鉴权兼容口径(2026-04-23)
- 登录请求口径对齐 quiz 老工程:
/api/v1/auth/login使用user_id + password,不再使用email + password。 - 密码校验采用双栈兼容:
- 优先兼容老库
BCrypt哈希; - 继续兼容现有
Argon2哈希。
- 优先兼容老库
- 用户状态采用兼容归一:
ENABLED/ACTIVE/1/TRUE视为可登录(active);DISABLED/INACTIVE/0/FALSE视为禁用(disabled)。
- 角色/权限读取优先走老表链路:
user_role_rela -> user_role计算role_codesrole_menu_rela -> menu映射permission_codes
- 管理员角色兼容别名:
- 命中
admin/sys_mgr/administrator或角色名含“管理员”时,统一附加admin角色码,用于现有require_permission放行逻辑。
- 命中
- 菜单树读取优先走老
menu表构建(用于/api/v1/admin/me/menus);读取失败时回退现有实现。
角色菜单管理兼容口径(2026-04-23)
- 后台角色/菜单管理(
/api/v1/admin/roles*、/api/v1/admin/menus*)已切换为老表链路:- 角色主表:
user_role - 用户角色关系:
user_role_rela - 角色菜单关系:
role_menu_rela - 菜单主表:
menu
- 角色主表:
- 角色/菜单 ID 口径统一为字符串(含前后端契约):
- 后端
api/app/schemas/admin.py的RolePublic/MenuPublic及其请求体均使用字符串 ID; - 前端
web/src/types/auth.ts的RoleItem/MenuItem/MenuTreeItem同步使用字符串 ID。
- 后端
- 菜单树(
/api/v1/admin/me/menus)ID 口径已对齐老表:- 直接返回
menu.menu_id/parent_id,不再生成临时递增 ID。
- 直接返回
- 旧库无独立
permissions表,/api/v1/admin/permissions与角色权限展示继续采用“菜单编码 -> 权限码”兼容映射策略。
前端构建类型口径(2026-04-23)
web在strict配置下,web/src/app/admin/**中事件/回调参数(如onChange/onClick/onFinish/showTotal/footer)需显式标注类型,避免noImplicitAny在next build阶段阻断。antd的Card在当前仓库类型环境下不稳定,页面层默认优先使用@/components/ui-antd的Card兼容包装;兼容层内部通过显式类型收敛渲染AntCard,避免 JSX 构造签名缺失报错。- 前端类型巡检推荐命令:
npm --workspace web exec tsc --noEmit --pretty false;用于在完整next build前快速发现strict类型门禁问题。 antd的Modal.footer自定义回调中,extra.OkBtn/CancelBtn必须按组件类型标注为FC(或由上下文推断),不要写成() => ReactElement;否则在next build的 TS 阶段会出现签名不兼容报错(Target signature provides too few arguments)。
后台菜单组件口径(2026-04-23)
- 后台壳层菜单(
web/src/app/admin/layout.tsx)统一使用 Ant DesignMenu(mode="inline")承载菜单树,不再使用递归Button + Link手工渲染。 - 菜单数据仍来自
/api/v1/admin/me/menus,并通过pathname计算selectedKeys,保证当前路由高亮。 - 菜单默认全展开(
openKeys覆盖全部带子节点菜单),与历史交互保持一致,避免层级菜单在首次进入时不可见。 - 顶部账号操作入口继续使用
DropdownMenu兼容层,不在本口径范围内。 - 后台导航布局基线为“左侧导航”:
- 桌面端(
md及以上)在左侧栏显示Menu; - 移动端通过左侧
Drawer展示同一套菜单树; - 不再使用顶部横向
Menu作为主导航承载。
- 桌面端(
后端运行时口径(2026-04-23)
- 登录兼容新增了
bcrypt校验分支后,api/requirements.txt必须包含bcrypt;否则 Docker 重建后api会在启动阶段报ModuleNotFoundError: No module named 'bcrypt'。 - 老菜单树构建(
build_legacy_menu_tree)在字符串 ID 口径下,节点字典键必须使用legacy_id(即menu_id);避免残留旧变量名导致/api/v1/admin/me/menus500。
后台壳层布局口径(2026-04-23)
web/src/app/admin/layout.tsx当前基线为“顶部固定头 + 左侧内嵌菜单 + 主内容区”:- 右上角提供菜单按钮,支持左侧菜单隐藏/显示;
- 左侧菜单承载组件统一为
AntMenu (inline),不再使用Drawer作为主菜单容器。
- 后台菜单数据口径不变:继续读取
/api/v1/admin/me/menus,按pathname计算选中项和展开项。 - 后续后台页面改造默认遵循“左侧内嵌菜单可折叠(显隐)”交互,除非有明确业务理由变更。
本地数据库初始化口径(2026-04-23)
- 当需要把 84 库老工程鉴权链路数据落到本地时,目标应优先选本地
fquiz-db的postgres数据库(非fquiz),避免覆盖新结构表。 - 本地初始化范围(本轮基线):
public.userspublic.user_rolepublic.menupublic.role_menu_rela
- 标准流程:
- 从
223.109.142.84:5432/postgres导出上述表schema + data; - 本地
postgres库执行DROP ... CASCADE后回放; - 导入数据阶段用同一会话临时
SET session_replication_role=replica,规避menu.parent_id自关联外键顺序问题; - 用
count + md5(signature)对比远端与本地一致性。
- 从
登录页双角色视觉口径(2026-04-23)
- 登录页主视觉已从单怪兽升级为“双角色怪兽”(毛怪 + 大眼仔)构图,实现在
web/src/app/page.tsx。 - 交互基线保持:眼睛跟随鼠标;密码输入时执行避视动作(毛怪转头,大眼仔轻微眯眼)。
- 视觉实现采用纯前端结构与 CSS 动效,不引入外部图片资源,不影响登录/注册链路。
前端配色口径(2026-04-23)
- 前端主题基线统一以 AntD token 为主,不再依赖历史 Radix 变量作为真实配色来源。
web/src/components/ui-antd.tsx的Theme内置ThemeCssVarsScope:- 使用
antdTheme.useToken()将历史变量(--gray-*、--accent-*、--red-*、--green-*、--orange-*、--indigo-*、--color-panel-solid、--border)映射到 AntD token。 - 同步注入
--ant-color-primary/bg-layout/border-secondary/text-secondary/text,供页面直接使用。
- 使用
web/src/app/globals.css保留上述变量的静态 fallback;运行时以ThemeCssVarsScope注入值为准。- 后续页面改造优先级:
- 新页面优先直接使用 AntD 组件与 token(含
--ant-color-*); - 存量页面可保留历史变量写法,由映射层兜底,不做一次性大迁移。
- 新页面优先直接使用 AntD 组件与 token(含
- 主题色切换口径:
- 全局主题色由
ThemeAppearanceContext管理; - 通过
useThemeAppearance()读写当前accentColor; - 已在后台顶栏提供选择入口(
web/src/app/admin/layout.tsx); - 用户选择持久化到
localStorage键fquiz:theme:accent-color,刷新后保持。
- 全局主题色由
前端路由展示口径(2026-04-23)
- 用户可见后台地址默认不再带
/admin前缀(例如/users、/requirements、/dashboard)。 - 兼容策略:
- 无前缀地址通过前端中间层 rewrite 到现有
app/admin/**页面实现; - 历史
/admin/**地址继续可访问,并自动重定向到无前缀地址。
- 无前缀地址通过前端中间层 rewrite 到现有
- 后台首页映射口径:
/admin对外统一为/dashboard。 - 菜单路径展示口径:前端渲染菜单时将后端返回的
/admin/**路径规范化为无前缀地址,避免导航条继续暴露/admin。
后台功能下线口径(2026-04-23)
- 已下线菜单编码:
admin.life_countdownadmin.passwordadmin.token_usageadmin.historyadmin.vocabularyadmin.diaryadmin.homeworkadmin.question_bank
- 下线策略:
- 种子菜单与 admin 默认菜单绑定中移除上述编码;
- 旧库授权链路通过
legacy_authz_service.DISABLED_MENU_CODES过滤,确保历史菜单记录不再出现在/api/v1/admin/me/menus; - 前端删除对应路由页面与首页卡片入口,直链不可达。
- 保留能力说明:
admin.job_mgr(作业监控)继续复用question_bankAPI;question_bank与vocabulary相关底层 API 保留,用于已保留模块(如分组管理/知识点管理/单词统计)。
功能下线口径(2026-04-23)
- 后台以下功能已统一下线:
- 微信小程序(
admin.wxapp) - MD解析(
admin.mdresolve) - 数据查询(
admin.data_query) - 热搜(
admin.hot_search) - 文件识别(
admin.filedetector) - 百度网盘(
admin.baidu_pan) - 分组管理(
admin.tag) - 知识点管理(
admin.knowledge_point_mgr)
- 微信小程序(
- 下线语义为“三重约束”:
- 前端页面路由删除;
- 后端菜单树与权限推导过滤上述菜单码;
- 种子菜单与默认角色绑定中移除上述菜单码。
- 兼容口径:即使旧数据库仍有历史菜单记录,也会被后端过滤,不再下发到
/api/v1/admin/me/menus。 - 补充口径:历史别名页面
/admin/tag已一并删除,避免“分组管理”通过旧路由绕过下线策略。
功能下线口径补充(2026-04-23)
- 以下后台功能已进一步下线:
- 脚本管理(
admin.cron_task_mgr) - 待办管理(
admin.todos) - 作业监控(
admin.job_mgr) - JWT 生成器(
admin.jwt_generator)
- 脚本管理(
- 下线语义:
- 前端页面路由删除(
/admin/cron、/admin/todos、/admin/job、/admin/jwt-generator); - 后端菜单树和权限推导过滤上述菜单码;
- 种子菜单与 admin 默认菜单绑定移除上述菜单码;
- JWT 生成器路由从
api_router取消挂载。
- 前端页面路由删除(
- 兼容口径:待办底层 API 继续保留给其他模块复用;菜单/页面是否暴露以后续下线口径为准。
功能下线口径补充(2026-04-24)
- 以下后台功能已进一步下线:
- 单词统计(
admin.knowledge_mastery) - 队列管理(
admin.queue_mgr)
- 单词统计(
- 下线语义:
- 前端页面路由删除(
/admin/vocabulary-proficiency、/admin/knowledge-mastery、/admin/jobqueue); - 后台首页入口卡片移除;
- 后端菜单种子与 admin 默认菜单绑定移除上述菜单码;
- 旧库菜单下发过滤集合新增上述菜单码,确保历史菜单残留不再透出。
- 前端页面路由删除(
管理员权限口径(2026-04-23)
- 默认将
admin角色视为“全权限角色”。 - 后端口径:
api/app/core/dependencies.py的require_permission/require_any_permission对admin角色直接放行。
- 前端口径:
web/src/components/auth-provider.tsx的hasPermission对admin角色直接返回true,避免因permission_codes枚举不全导致入口误隐藏。
- 安全边界:
- 前端仅负责显隐与交互;最终权限判定以后端依赖校验为准。
首页与登录口径(2026-04-23)
/默认作为登录入口页,不再承载“已登录后停留的首页面板”。- 登录态(含刷新会话恢复)进入
/时,前端立即跳转/dashboard,实现“登录后直达后台”。 - 后台壳层文案对齐:
- 未登录访问后台时提示“前往登录”(
/); - 账号菜单提供“后台首页”(
/dashboard),不再出现“返回首页”歧义入口。
- 未登录访问后台时提示“前往登录”(
- 退出登录口径:统一跳转到登录页
/(不保留在当前后台路由)。
站点标题口径(2026-04-24)
- 全局浏览器 Tab 标题统一为“需求管理”。
- 入口配置位于
web/src/app/layout.tsx的metadata.title。
登录页视觉口径(2026-04-24)
- 登录页采用“双栏工作台”视觉基线:
- 左侧为品牌与机器人主题视觉区;
- 右侧为白色登录卡片(品牌头、表单、主操作按钮、辅助链接)。
- 交互口径保持:
- 登录态进入
/仍自动跳转/dashboard; - 登录/注册逻辑不变,视觉改造不改变鉴权接口契约。
- 登录态进入
后台账号入口口径(2026-04-23)
- 后台右上角账号入口采用 AntD
Avatar作为下拉触发器,不再使用“账号”文字按钮。 - Avatar 文案默认使用用户名首字母(大写),空值兜底
U。 - 下拉内容口径保持不变:账号信息 + 后台首页 + 退出登录。
后台左侧导航口径(2026-04-24)
- 后台壳层左侧导航采用“AntD 文档站点式”固定侧栏布局(参考
https://ant.design/components/avatar-cn):- 桌面端(
md及以上)常驻显示; - 位于顶部栏下方(
top: 64px),高度calc(100vh - 64px); - 菜单区可独立滚动,侧栏与主内容通过右边框分隔。
- 桌面端(
- 右上角不再提供“隐藏菜单”按钮;主布局不再依赖菜单显隐状态切换。
授权兼容口径(2026-04-24)
legacy_authz_service在读取 legacy 关系表失败时,必须对会话做安全回滚,再执行 modern 兜底查询,避免事务错误污染导致角色/权限误判为空。legacy_authz_service._load_modern_roles需显式预热Rolemapper 后再解析User.roles,避免首轮 mapper 解析异常被吞掉后出现“空权限”。- 对
user_id in {admin, administrator, root, sysadmin}且无角色映射的账号,授权链路提供内置admin兜底,确保本地/迁移期管理员账户可用。 - 当本地兼容库缺少
user_role_rela且用户无显式角色映射时,授权链路可回退到user角色(前提是user角色存在),防止/api/v1/admin/me/menus返回空数组导致后台左侧菜单空白。
后台主题切换口径(2026-04-24)
- 后台右上角主题入口统一采用 Ant Design 文档站(
avatar-cn)的“主题图标 + Dropdown 菜单”交互,不再使用简单 Select 模式切换。 - 主题文案口径固定为:
跟随系统 / 浅色主题 / 暗黑主题 / 紧凑主题 / 快乐工作特效 / AI 生成主题 / 主题编辑器。 - 主题状态模型固定为“主模式 + 开关项”:
- 主模式:
auto/light/dark(互斥) - 开关项:
compact、happy-work(独立开关)
- 主模式:
- 持久化键口径:
fquiz:theme:primary-modefquiz:theme:compactfquiz:theme:happy-work- 兼容保留:
fquiz:theme:mode(legacy 四态映射)
AI 生成主题当前为交互与文案对齐态,未内置站内 AI 主题生成流程;“主题编辑器”默认跳转官方编辑器页。
登录页文案口径(2026-04-24)
- 登录页(
web/src/app/page.tsx)默认展示文案统一为中文,不再保留英文提示文案。
前端编译口径(2026-04-24)
- 在当前栈(Next.js 16 + React 19 + Ant Design 5)下,页面层直接使用
antd的Card/Image容易触发 JSX 类型不兼容报错(TS2604/TS2786)。 - 项目口径:页面层优先使用
@/components/ui-antd提供的Card封装;Mermaid 预览改用原生<img>。 - 当前
web/tsconfig.json已显式设置noImplicitAny=false以保证存量页面可编译;若后续要恢复更严格类型检查,需要分批补齐事件/回调参数类型。
菜单删除兼容口径(2026-04-24)
legacy_admin_rbac_service中涉及 legacy 关系表user_role_rela的查询(如_get_users_with_menu_access、_get_role_user_ids)必须按“缺表可降级”策略实现:- 捕获
SQLAlchemyError; - 执行
db.rollback()清理失败事务; - 返回空集合兜底,避免向上冒泡为 500。
- 捕获
- 背景约束:当前本地兼容库可能不存在
user_role_rela(仅保留user_role/role_menu_rela),菜单删除链路需在该条件下可用。
认证时效口径(2026-04-24)
- API
access token默认有效期已调整为8 小时(ACCESS_TOKEN_EXPIRE_MINUTES=480)。 refresh token(Refresh Session)默认有效期保持30 天(REFRESH_TOKEN_EXPIRE_DAYS=30)不变。