Files
ftb-project-management/docs/architecture.md
Script Generator 6d2f6d8b9f docs+fix: 4份核心文档 + 项目模块版本记录数据全联动
文档:
- architecture.md - 整体架构、心智模型、关键设计原则
- decisions.md - 16条关键决策记录(含为什么)
- workflow.md - 工作流程和协作偏好
- roadmap.md - V1/V2/V3 路线图和已完成清单

修复项目详情版本记录:
1. 状态胶囊数据联动(开发中分支也补传 stageProgress)
2. 日期数据联动:
   - 实际开始 = 取所有阶段最早 actualStartAt/startDate/startedAt
   - 实际截止 = 取所有阶段最晚 completedAt/closedAt
   - 数据完全和版本详情一致

VersionCard 的 versionData useMemo 增加 actualStart/actualEnd 派生字段,
两种状态分支(developing/released)都使用派生值,不再用静态 version.startDate

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 12:40:10 +08:00

5.8 KiB
Raw Blame History

FTB 智能项目管理系统 — 架构文档

项目定位

FTB 是一个面向中小型研发团队的项目管理平台,集成 AI 能力辅助决策。核心层级:

产品Product → 项目Project → 版本Version → 需求/任务/用例/Bug

不是给测试团队的工具,也不是 Jira 替代品。核心目标是让产品/项目经理在一个页面看到:"开发完了吗 → 验收过了吗 → 还有多少 BUG → 能不能发布"

心智模型(重要)

系统设计遵循三条维度线的分离:

语义线Why         执行线How         质量线Quality
─────────────────    ─────────────────     ────────────────
Requirement          Version               TestCase
解释为什么做           驱动状态流转            └─ Bug
不参与流程             所有状态看版本           质量闭环

Requirement需求= 语义层,解释功能范围和业务原因,不驱动流程。 Version版本= 执行主线,所有任务归属版本,状态由版本派生。 TestCase + Bug = 质量闭环,挂在版本上验收。

技术栈

技术 说明
前端 Next.js 14 (App Router) TypeScript + 客户端组件为主
UI Tailwind CSS + Shadcn/ui 紧凑信息密度、现代风格
状态 Zustand 每个领域一个 store
持久化 localStorageV1 后端 NestJS + Prisma 已搭好但未启用
后端 NestJS + Prisma + PostgreSQLV2 暂未启用
AI Anthropic SDKV3 远景) 健康度/风险预警/排期建议

模块结构

apps/web/
├── app/
│   ├── products/        # 产品列表 + 详情(点击项目可跳转)
│   ├── projects/[id]/   # 项目详情:版本卡片/状态胶囊
│   ├── versions/        # 版本列表 + 详情
│   ├── requirements/    # 需求池
│   ├── workspace/       # 与我相关(聚合工作台)
│   └── admin/           # 系统管理(任务类型字典等)
├── components/
│   ├── product/         # 产品组件
│   ├── version/         # 版本组件PlanTab, CapsuleStages, MemberChips...
│   ├── dev-task/        # 开发任务组件
│   ├── test-case/       # 测试用例组件
│   ├── bug/             # Bug 组件
│   └── requirement/     # 需求组件
├── lib/
│   ├── derive.ts        # 派生数据flattenVersions/flattenProjects
│   ├── linkage-engine.ts    # 跨模块联动引擎需求↔DevTask 派生状态)
│   ├── workspace-engine.ts  # 工作台聚合引擎统一WorkItem
│   ├── version-status.ts    # 版本执行态推导
│   ├── version-plan.ts      # 计划任务(调研/产品/UI
│   ├── dev-task.ts          # 开发任务
│   ├── test-case.ts         # 测试用例
│   ├── bug.ts               # Bug
│   └── requirement.ts       # 需求
└── stores/              # Zustand stores每个领域独立

关键架构原则

1. 引擎模式(关键)

跨模块的数据派生通过引擎层处理,不是各 store 互相调用:

  • linkage-engine.ts:从 DevTask 状态派生需求"实际进度",新建模块只需在此聚合
  • workspace-engine.ts:聚合 WorkItem 给"与我相关"页面用

引擎是纯函数,输入多个 store 数据,输出统一视图。引擎使应用各模块松耦合,新增模块时不需要改其他模块的代码。

2. 派生胜过存储

时间字段、状态、进度都尽量从底层数据派生,而不是手填:

  • 实际工时 = startDate → completedAt 时间差(精确到 0.5h
  • 阶段耗时 = 所有阶段任务的最早开始 → 最晚完成
  • 需求开发状态 = 从 DevTask 状态聚合
  • 版本执行态 = 从所有 DevTask + TestCase + Bug 聚合
  • 阶段进度 = 已完成子任务/总子任务

3. 时间戳精确到分钟

所有"实际开始/完成"时间都是 ISO 时间戳(含时分秒),不是日期。展示时统一 slice(0, 16).replace('T', ' ')

4. 数据联动

修改 A 影响 B 时,B 通过 filter A 派生,不要双向写。例:

  • 需求关联到版本:需求设 versionId,版本详情 requirements.filter(r => r.versionId === id)
  • 删除版本清理孤儿数据PlanTask/DevTask/TestCase/Bug + 释放 Requirement.versionId

状态机概览

实体 状态流转
Requirement pending_review → adopted → planned → developing → testing → released → closedrejected 可回 pending_review
VersionPlan pending → in_progress → completed
DevTask todo → in_progress → testing → submitted终态提测=已完成)
TestCase pending → running → passed/failed/blocked
Bug open → fixing → fixed → verifying → closed/rejected

DevTask 没有"已完成"状态,"已提测"就是终态——开发交付完成,后续 Bug 单独流转。

数据持久化

V1当前 全部 localStorage每个 store 独立 key

  • ftb_overview_v1 - 产品/项目/版本树
  • ftb_requirements_v3
  • ftb_version_plans_v1
  • ftb_dev_tasks_v1
  • ftb_test_cases_v1
  • ftb_bugs_v1
  • ftb_overtime_v1
  • ftb_task_categories_v1

V2计划 NestJS + Prisma + PostgreSQLSchema 已设计但尚未运行 migration。

权限模型(轻量)

V1 仅做前端校验,无后端鉴权:

  • 版本 members 字段限定参与者
  • 版本列表/详情按 members.contains(currentUser) 过滤
  • 创建版本时自动加入创建者
  • 版本 members 为空时所有人可见(兼容旧数据)

V2 接入后端后改为基于 ProjectMember 表的 RBACOwner/Admin/Member/Viewer