14 KiB
森林AI MVP 统一重构设计
1. 背景与目标
当前仓库已经具备项目工作台 MVP 的主要页面、数据模型和部分 API,但品牌、前端体验、API 契约、后端职责边界和开发文档尚未形成一致体系。本次重构允许调整既有 API 和开发数据结构,不要求向后兼容;目标是得到一个可启动、可验证、结构清晰的“森林AI”MVP。
本设计覆盖:
- 使用已确认的森林AI SVG ICON 替换前端品牌占位图形。
- 页面标题和产品文案统一为“森林AI”。
- 系统整理前端配色、字体、布局、响应式行为和文案。
- 重新定义前后端 API 契约并打通 MVP 核心操作。
- 拆分后端过大的模块,明确职责,并补充有价值的中文注释。
- 更新 README、开发启动配置和验证说明。
本设计不引入实时聊天、项目角色体系、匿名公开分享、自主 Agent、语义/向量搜索、支付、第三方数据源集成、原生移动 App 或浏览器扩展。
2. 现状审计
审计基于 2026-07-21 本地运行的真实页面,桌面视口为 1440×1024,移动视口为 390×844。证据保存在 apps/web_v1/test-results/audit-current/,该目录仅用于本地审计,不提交到仓库。
2.1 登录页
- 三栏登录卡片在 1440px 宽度下已经裁切右侧内容。
- “森林Agent”“SenlinAI”“AI Agent”同时出现,品牌命名不一致。
- 服务器连接检测可工作,但错误恢复路径和说明不够清晰。
- 登录卡片承载了过多营销式内容,与私有部署入口的主要任务竞争。
2.2 全局工作台
- 项目轨道、搜索和聚合任务的结构清晰,可以保留。
- 页面下半部分空白过多,卡片密度和信息节奏不均衡。
- 品牌仍使用字母
S占位。 - 状态栏包含固定展示数据,并存在
<button>嵌套<button>的无效 DOM。
2.3 项目概览与频道
- 项目侧栏的信息架构清楚,但项目横幅色彩过强,压过了主要内容。
实时接口、固定进度等文案没有提供真实状态含义。- 已存在的项目标签没有稳定显示在任务卡片上。
- AI 智能体页面缺少视觉检查所要求的标题。
- 多个可见按钮没有行为,包括搜索、资料排序、探索同步、AI 发送、频道保存和部分工具栏动作。
2.4 移动端
@media (max-width: 1180px)仍强制工作台min-width: 1180px。- 390px 视口只显示桌面布局左侧切片,主内容不可正常访问。
- 当前实现不满足“桌面优先,同时保持移动浏览器可用”的项目要求。
2.5 API 与后端
- CORS 允许端口以硬编码列表存在,审计端口 4176 被拒绝,开发配置容易漂移。
- 列表接口、创建接口和工作区 DTO 同时存在 Go 默认 PascalCase 与手写 camelCase 响应。
- 前端为项目类型兼容两种大小写字段,但其他类型没有一致策略。
projects/service.go超过 800 行,混合项目写入、任务、标签、工作区查询、格式化和用户解析。projects/handlers.go超过 360 行,重复当前用户、路径参数、请求绑定和错误响应逻辑。search、ai、notes和tasks中已有部分服务,但并未完整注册为前端可用接口。backend/internal几乎没有说明业务边界的注释。
3. 总体方案
采用“森林AI MVP 统一版”:
- 保留现有 React + TypeScript + Vite + Arco Design 技术栈和工作台信息架构。
- 建立统一品牌资产和前端设计令牌,修复桌面与移动布局。
- API 迁移到
/api/v1,只提供 camelCase DTO,对外使用 UUIDv7 identity。 - 后端按业务职责拆分 handler、service 和 DTO,不直接向 API 返回 Gorm 模型。
- 仅打通 MVP 核心能力;对超出范围的可见控件移除、禁用或提供明确说明。
- 开发数据库允许重建,但程序不得自动删除生产数据。
4. 品牌资产
4.1 ICON
ICON 遵循 docs/superpowers/specs/2026-07-21-senlinai-icon-design.md:
- 无文字 SVG,
viewBox="0 0 128 128"。 - 森林蓝圆角方形,主色
#165DFF。 - 白色树冠融合年轮、知识层次和脑回路。
- 青绿与浅蓝节点表达 AI 和知识连接。
- 不使用渐变、滤镜、字体或外部资源。
正式源文件为 apps/web_v1/public/senlinai-icon.svg。favicon.svg 使用同一图形。登录页、顶部品牌区和项目轨道工作台按钮均引用该文件,不复制内联 SVG。
4.2 命名
- HTML
<title>:森林AI。 - 产品可见名称:
森林AI。 - 英文域名、包名和内部标识可继续使用
senlinai。 - 不再出现
森林Agent、SenlinAI Workbench或以字母S作为品牌图形。 AI智能体统一写作AI 助手,避免暗示自主执行能力。
5. 前端体验设计
5.1 设计令牌
在独立的主题样式文件中集中维护:
- 主色:
#165DFF。 - 浅色背景、面板、边框、主文字、次要文字和状态色。
- 深色主题使用同名语义令牌,不在组件中散落另一套品牌色。
- 间距使用 4、8、12、16、24、32px 尺度。
- 控件圆角以 6–8px 为主,项目头像可使用更明显圆角。
字体使用系统中文字体栈:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif。正文保持 14px 基准,辅助文字 12px,页面标题 24–28px,不随视口连续缩放。
5.2 登录页
- 桌面使用品牌说明 + 登录表单双栏,不再使用会被裁切的三栏结构。
- 服务器地址位于首位,保留连接状态和重新检查。
- 登录失败显示可执行的中文错误信息。
- 移动端改为单栏,品牌说明压缩到表单上方。
- 隐私政策和服务协议在没有实际页面时不显示为伪链接。
5.3 工作台布局
- 桌面保留 96px 项目轨道和 248px 项目频道侧栏。
- 1180px 以下将频道侧栏改为抽屉或可收起面板。
- 768px 以下隐藏常驻项目轨道,使用顶部导航按钮打开项目与频道抽屉。
- 主内容始终占满剩余宽度,不设置强制桌面
min-width。 - 底部状态栏在移动端精简,仅保留真实状态;修复嵌套按钮。
5.4 页面与文案
- 工作台概览压缩无意义空白,保留项目、未完成任务、AI 会话和知识资料四项真实指标。
- 项目横幅使用项目色作为小面积强调,不使用整块高饱和背景压制内容。
- 删除
实时接口、固定进度 60%、固定存储空间等假状态。 - 任务卡显示后端真实标签、状态、负责人、截止时间和创建时间。
- 搜索框连接关键词搜索接口。
- 项目设置连接项目更新接口。
- 创建项目、任务、标签、资料和计划任务继续使用真实 API。
- Inbox 使用收集、分析建议、用户确认创建对象的现有安全流程。
- AI 助手保留会话列表和受控请求入口;未经确认不创建正式对象。
5.5 不支持控件
以下功能不在本次 MVP 中实现:探索数据源同步、第三方连接、升级支付、窗口停靠、真实频道外链管理和自主 Agent。对应控件应移除,或在必须保留入口时明确显示“暂未开放”,不得表现为可成功执行的操作。
5.6 可访问性
- 每个图标按钮有可访问名称。
- 页面使用正确的标题层级、
main、nav和aside语义。 - 键盘可完成登录、项目切换、频道切换、搜索和核心表单提交。
- 焦点状态清晰,错误不只依赖颜色。
- 交互目标最小 40×40px;小型状态标签不承担点击行为。
- 自动化检查不能证明完整 WCAG 合规,仍需键盘和辅助技术人工复核。
6. API 设计
6.1 通用约定
- 前缀:
/api/v1。 - JSON 字段:camelCase。
- 对外 ID:模型 UUIDv7
identity字段,序列化为字符串。 - 时间:RFC 3339 UTC;显示格式由前端处理。
- 成功状态码:读取 200,创建 201,无响应体更新 204。
- 错误格式:
{"error":{"code":"invalid_request","message":"请求参数无效"}}。 - bearer session token 继续由认证中间件校验,handler 从上下文获取当前用户。
6.2 公共接口
GET /api/v1/statusPOST /api/v1/auth/login
6.3 项目与工作区
GET /api/v1/projectsPOST /api/v1/projectsGET /api/v1/projects/:projectIdPATCH /api/v1/projects/:projectIdGET /api/v1/projects/:projectId/workspace
工作区响应聚合项目、频道计数、标签、Inbox、任务、AI 会话、笔记资料和计划任务,供首屏一次加载。
6.4 任务与标签
POST /api/v1/projects/:projectId/tasksPATCH /api/v1/projects/:projectId/tasks/:taskIdGET /api/v1/projects/:projectId/tagsPOST /api/v1/projects/:projectId/tags
任务响应使用同一 Task DTO,创建与更新接口不得返回数据库模型。任务移动到另一项目时重新校验所有权,并清理不属于目标项目的标签。
6.5 资料、计划任务与 Inbox
POST /api/v1/projects/:projectId/sourcesPOST /api/v1/projects/:projectId/cron-plansPOST /api/v1/projects/:projectId/inboxPOST /api/v1/inbox/:inboxId/analyzePOST /api/v1/inbox/:inboxId/confirm
文件路径只由文件服务生成。Inbox 确认创建的对象继续保存来源 Inbox identity。
6.6 搜索与 AI
GET /api/v1/search?q=...GET /api/v1/projects/:projectId/ai-sessionsPOST /api/v1/projects/:projectId/ai-sessions
AI provider 请求必须先经过限流和密钥选择,随后记录 provider、key 类型、action、status 和 error。前端不得把 AI 结果直接保存为正式任务、笔记或资料。
7. 后端结构
继续遵守 backend/internal/logic 业务包规则和 backend/internal/models 模型集中规则。
7.1 httpx
router.go:路由装配和中间件。response.go:统一成功与错误响应。params.go:identity 路径参数和分页/查询参数解析。- CORS 从配置读取允许来源;开发默认值与 Vite 默认端口一致。
7.2 projects
service.go:项目创建、读取和更新。workspace.go:只负责工作区聚合查询。dto.go:项目和工作区响应 DTO。handlers.go:项目与工作区 HTTP 接口。ownership.go:项目所有权查询与复用校验。
7.3 其他业务包
tasks:任务 CRUD、指派和显式分享。files:文件保存路径和资料记录。inbox:收集、建议和确认。search:关键词搜索 handler 与 service。ai:会话、密钥、限流和调用审计。notes:笔记服务保持聚焦;没有前端写入需求时不新增多余接口。
7.4 中文注释
中文注释覆盖:
- 导出的业务接口和 DTO 的用途。
- 认证、所有权、任务分享、Inbox 确认和 AI 调用的安全边界。
- identity 与内部自增 ID 的转换原因。
- 工作区聚合和非显然查询的设计意图。
不对简单赋值、普通条件判断或显而易见的 CRUD 步骤堆砌注释。
8. 数据与配置
- 保留
sa_表名前缀和Sa模型前缀。 - 本地开发数据允许清空后通过
go run ./cmd/seed重建。 - 代码不得在启动时自动 drop 表或删除生产数据。
- Docker Compose、
agent.dev.yaml和 README 使用一致的 PostgreSQL 用户、密码、数据库名和端口。 - PostgreSQL 集成测试继续从
DATABASE_URL读取实时测试数据库 URL。 - CORS 允许来源通过配置项表达,默认覆盖 Vite 开发地址和 Tauri 地址。
.superpowers/、运行日志、审计截图和本地文件存储目录不提交。
9. README
README 使用 UTF-8 中文并包含:
- 森林AI 产品定位和 MVP 边界。
- 技术栈与目录结构。
- 环境要求和一套可复制的本地启动步骤。
- 数据库初始化与演示数据命令。
- 配置文件与敏感信息说明。
/api/v1核心接口概览。- 后端、前端和桌面端验证命令。
- 常见启动问题:数据库连接、CORS、端口冲突和登录凭据。
10. 错误处理与状态
- 前端 API client 解析统一错误 DTO,并向用户显示中文消息。
- 网络不可达、401、403、404、409 和 500 使用不同文案。
- 所有异步写操作显示 loading,成功后刷新对应工作区数据。
- 空项目、空任务、空资料和空搜索结果使用明确的下一步说明。
- 后端内部错误写日志,但响应不泄露数据库、路径或密钥细节。
11. 验证与验收
11.1 后端
go test ./...通过。- handler 契约测试断言 camelCase DTO、identity 参数和标准错误结构。
- 项目所有权、跨项目任务移动、标签范围、分享范围、文件路径和 AI 限流均有测试。
- 如提供
DATABASE_URL,PostgreSQL 集成测试通过。
11.2 前端
node scripts/visual-check.mjs通过,无 console error。npm run build通过。npm run lint通过。- 1440×1024 登录、工作台、项目概览和任务页截图无裁切或横向溢出。
- 390×844 登录和项目页可访问主内容,导航可打开与关闭。
- 页面
<title>为“森林AI”,品牌位置均使用正式 ICON。 - 搜索、项目设置、创建项目、任务、标签、资料和计划任务完成真实 API 往返。
11.3 文档与提交
- README 中的启动和验证命令与仓库实际脚本一致。
- 每个实施任务创建一个聚焦提交。
- 不提交真实凭据、本地数据库、运行日志、审计临时文件或构建产物。
12. 实施顺序
- 品牌 ICON、标题、设计令牌和前端基础语义。
- 登录页与响应式工作台布局。
/api/v1通用契约、identity 参数与项目/工作区接口。- 任务、标签、资料、计划任务、Inbox、搜索和 AI 会话接口对齐。
- 后端文件拆分、中文注释和契约测试补齐。
- README、开发配置、演示数据和全量验证。