全栈项目实战
Day 1–16 你练过了所有招式——今天把它们串起来。 用一个真实的小项目(Mini Task Tracker,FastAPI + React)走完 CLAUDE.md → 脚手架 → DB → API → 前端 → 测试 → 部署七步。 你会看到 Hooks 在每次编辑后自动跑 lint,Skills 把"开新组件"压成一条命令, MCP 把数据库 schema 喂给 Claude,Subagent 并行写测试与文档—— Claude Code 从助手升级为独立产出 PR的搭子。
思维导图
FIG M — DAY 17 KNOWLEDGE MAP · FULL-STACK PROJECT WORKFLOW
项目蓝图
不论用不用 AI,全栈项目最大的浪费是边写边想。 Day 15 学的 Plan 模式在这里第一次真正用上——先把架构、栈、范围画清楚, 让 Claude 知道这是个什么东西, 后面 6 小时的写码才不会原地打转。
今天的样例:Mini Task Tracker
麻雀虽小,五脏俱全:注册登录、增删任务、按标签筛选、按截止日排序、按状态归档。 这五条功能切片刚好覆盖全栈所有典型组件—— Auth、CRUD、Filter、Sort、State Transition。
技术栈一览
| 层级 | 选型 | 为什么选它 | 替代品 |
|---|---|---|---|
| 后端 | FastAPI + SQLAlchemy 2.x + Pydantic v2 | 类型提示丰富,Claude 容易理解;自动 OpenAPI 给前端用 | Express / Nest / Go-Gin |
| 数据库 | SQLite (dev) → Postgres (prod) | 本地零依赖;线上换 DSN 即可,迁移脚本不变 | Postgres-only / Turso |
| 前端 | React 19 + Vite + TypeScript + Tailwind | 组件化清晰,Tailwind 让 Claude 改样式不用查类名 | SvelteKit / Vue 3 / Solid |
| 测试 | pytest + Vitest + Playwright | 单元 / 集成 / E2E 三层覆盖;Playwright 截图便于 Claude 自检 UI | Jest / Cypress |
| 部署 | Docker + GitHub Actions + Fly.io | Dockerfile 单文件即可上线;Actions 触发 deploy | Railway / Render / Vercel |
| 选型口诀 | 语言统一(都用 TS / Py)、有类型(Claude 才能推导)、能本地跑(脱网开发)、单文件部署 | ||
项目架构图
FIG 01 · 三层架构 — UI / API / DB,Docker Compose 一键起,Fly.io 上线
四条 AI-driven 全栈开发原则
蓝图先行
动手前先用 /plan 把目录、模型、端点定下来。结构错了改一次比写错代码改十次贵。
API 先于 UI
先写后端 + OpenAPI Schema,前端从 schema 生成类型——避免"前端假装数据、后端跟着改"的反向开发。
测试是合同
每个端点先写测试再写实现(TDD)。测试是 Claude 改代码时的安全网,没测试的代码 = 没合同的工人。
一切自动化
能让 Hook 跑的不手动跑、能让 Skill 一句话搞定的不重复打字、能让 Subagent 并行的不串行。
CLAUDE.md 项目奠基
Day 03 教你写 CLAUDE.md,那时它可能只有 20 行。 真实全栈项目里它应该是厚厚一份—— 告诉 Claude 项目是什么、技术栈是什么、规范是什么、 什么绝对不能做、出问题去哪里查。 项目级 CLAUDE.md 是你和 Claude 之间的项目契约。
四个必备章节
项目说明
一句话讲清这是什么、给谁用、解决什么问题;列出技术栈和外部依赖。新成员(包括 Claude)读完应知"我在做什么"。
编码规范
命名风格、文件组织、类型严格度、错误处理范式、注释要求——把口头默契写成可执行的规则。
常用命令
装依赖、跑测试、起 dev server、跑迁移、build、deploy——所有人都该知道的"make 命令清单"。Claude 不用再 grep package.json。
禁忌(最重要)
"不要 commit 进 main"、"不要写 raw SQL"、"不要在前端处理鉴权"——把过去栽过的坑明文写出来。Claude 不会自己悟。
真实项目 CLAUDE.md 模板
# CLAUDE.md — Mini Task Tracker ## 项目说明 个人任务追踪 SaaS,后端 FastAPI + Postgres,前端 React 19 + Vite。 单租户、用户自己管理自己的 tasks/tags。**目前 MVP 阶段**, 不要引入复杂的多人协作 / 团队功能。 ## 技术栈 - 后端: Python 3.12 + FastAPI 0.118 + SQLAlchemy 2.x + Pydantic v2 + Alembic - 前端: React 19 + TypeScript 5.4 + Vite 6 + Tailwind v4 + TanStack Query - 测试: pytest (后端) · Vitest + Playwright (前端) - 部署: Dockerfile + Fly.io · CI 走 GitHub Actions ## 目录结构 - `backend/` FastAPI 服务 + Alembic 迁移 - `frontend/` React app, 入口 src/main.tsx - `infra/` Dockerfile, fly.toml, deploy 脚本 - `.github/` CI / CD workflow ## 编码规范 - Python: ruff + mypy --strict,所有函数必须有类型注解 - TS: tsc --noEmit + eslint,**不允许 any**,组件全用 function component - 提交信息走 Conventional Commits: feat / fix / chore / docs - 测试覆盖率 >= 80% — CI 卡线 ## 常用命令(Make 风格) - $ make dev # 同时起前后端 - $ make test # 跑全部测试 - $ make migrate # 生成 + 应用迁移 - $ make lint-fix # 自动修可修的 - $ make deploy # fly deploy ## 禁忌(踩过的坑,别再踩) - ❌ **不要在前端做 token 校验** — 一律走后端 middleware - ❌ **不要用 raw SQL** — 走 SQLAlchemy ORM,迁移走 Alembic - ❌ **不要把 .env 提交进 git** — 已 gitignore,看 .env.example - ❌ **不要在 main 分支直接 push** — 走 PR - ❌ **不要跳过测试合并** — CI 卡 80% 覆盖率 ## 出问题去哪查 - 接口形态: 看 backend/openapi.json (CI 自动生成) - 表结构: 用 db MCP 查 prod 副本(只读) - 历史决策: docs/decisions/*.md (ADR 风格)
路径级规则(精准提示)
# .claude/rules/backend.md —— 只在 backend/ 下生效 apply_to: - "backend/**/*.py" ## Backend 专属规则 - 所有路由文件放 `backend/routers/`,按资源分文件: tasks.py / tags.py / auth.py - DB session 通过 FastAPI Depends 注入,**不要全局变量** - 异常: 用 `HTTPException`,**不要 return error dict** - 日志: `logging.getLogger(__name__)`,**不要用 print**
# .claude/rules/frontend.md —— 只在 frontend/ 下生效 apply_to: - "frontend/src/**/*.tsx" - "frontend/src/**/*.ts" ## Frontend 专属规则 - 远端请求一律走 TanStack Query 的 useQuery / useMutation - 表单用 React Hook Form + Zod - 组件 props **必须**显式 Type,**不允许 React.FC** - 样式只用 Tailwind class,**不写 inline style**
.claude/ 配置矩阵
# 项目根目录结构(完整版) project/ ├── CLAUDE.md # 项目契约(80 行) ├── .claude/ │ ├── settings.json # 团队共享设置 │ ├── settings.local.json # 个人覆盖(gitignored) │ ├── .mcp.json # db / github MCP 配置 │ ├── rules/ │ │ ├── backend.md # 后端规则 │ │ ├── frontend.md # 前端规则 │ │ └── migrations.md # Alembic 规则 │ ├── skills/ │ │ ├── new-endpoint.md # 新增一个 API 端点(含测试) │ │ ├── new-component.md # 新增一个 React 组件 │ │ └── ship.md # 构建 + 部署 + 跑 smoke │ ├── agents/ │ │ ├── tester.md # 专门写测试的子代理 │ │ └── reviewer.md # 专门做 code review 的子代理 │ └── hooks/ │ └── post-edit.sh # 编辑后自动 lint + 跑相关测试 ├── backend/ # Python 后端 ├── frontend/ # React 前端 └── infra/ # Dockerfile + fly.toml
脚手架 → API → 前端
地基打好后,七步 build pipeline 走完一轮,一个能跑的 MVP 就出来了。 关键不是每一步会用什么命令——而是每一步用对模式: 何时 Plan、何时 TDD、何时让 Subagent 接手。
7 步 Build Pipeline
FIG 02 · BUILD PIPELINE — 7 STEPS · ~5 HOURS · MIXED MODES
阶段 A · 脚手架(Plan → 落地)
# Step 1 — 用 plan 模式让 Claude 先给方案,不要直接动手 > /plan > 帮我搭一个 mini task tracker 的脚手架: · monorepo: backend/(FastAPI + Alembic) · frontend/(Vite+TS) · infra/ · Makefile: dev/test/migrate/deploy 四个目标 · .gitignore · .env.example · pre-commit hook · 不要写业务代码 — 只搭骨架,所有路由先返 501 # Claude 会回一份 plan(目录 + 关键文件清单),用户确认后才执行 > 通过,执行
# Step 2 — 验证脚手架能跑 $ make dev # backend 起在 :8000, frontend 起在 :5173 — 都返 hello / 501,即 OK
阶段 B · DB 模型与迁移
> 在 backend/models/ 下建三张表: · users(id, email, hashed_password, created_at) · tasks(id, user_id FK, title, description, due_date, status, created_at) · tags(id, name) + tasks_tags 多对多关联表 生成对应 SQLAlchemy 2.x 风格 model + 一份 Alembic 初始迁移 $ make migrate # Claude 已经写好,你只需跑一下 INFO Running upgrade -> 7f3a2b — initial schema
阶段 C · API 端点(TDD 循环)
# 关键: 一次开一个端点,先测试再实现 — 走 Day 6 的 TDD 模式 > 用 TDD 模式实现 POST /tasks: 1. 先在 backend/tests/test_tasks.py 写 5 个测试: - 未登录 401 - title 为空 422 - 正常创建 201 返 task obj - status 默认为 "open" - due_date 必须未来 2. 跑测试确认全部失败 3. 在 backend/routers/tasks.py 实现端点直到全过
# Claude 的执行轨迹(简化): [Edit] backend/tests/test_tasks.py # 写测试 [Bash] pytest backend/tests/test_tasks.py 5 failed — expected, no impl yet [Edit] backend/routers/tasks.py # 写实现 [Edit] backend/schemas/task.py # Pydantic schema [Bash] pytest backend/tests/test_tasks.py 5 passed in 0.42s ✓ [Hook · post-edit] ruff check backend/ # 自动 lint [Hook · post-edit] mypy backend/ # 自动类型检查
阶段 D · 前端(Subagent 并行)
# 前端有 5 个页面 + ~12 个组件 — 用 Subagent 并行铺开 > 派出三个 subagent 并行做: · agent A: frontend/src/api/ 从 backend/openapi.json 生成 TS 类型 + fetch client · agent B: frontend/src/components/ 建 TaskCard / TaskList / FilterBar 三个基础组件 · agent C: frontend/src/pages/ 建 LoginPage / TasksPage / 路由配置 agent A 完成后 agent B/C 才能用类型,所以 A 串行,B/C 并行
# 实际跑下来: [Agent A] 完成 — 3 min · 生成 api/client.ts (147 行) + types.ts (89 行) [Agent B] 进行中 ... 完成 — 8 min · TaskCard.tsx + TaskList.tsx + FilterBar.tsx [Agent C] 进行中 ... 完成 — 6 min · LoginPage.tsx + TasksPage.tsx + router.tsx $ cd frontend && npm run dev UI 已经能登录 → 看 task 列表 → 新建 task,~17 min 完成
测试与部署
代码能跑只是开始。能跑得稳、能上线、能被监控才算 ship。 这一阶段把三层测试矩阵补齐、Dockerfile 写好、GitHub Actions 接通—— 之后每次 PR 都自动跑全套校验,绿了才能 merge。
三层测试矩阵
| 层级 | 工具 | 覆盖什么 | 典型例 |
|---|---|---|---|
| 单元测试 | pytest · Vitest | 函数 / 工具 / 组件 — 不动 DB / 不动网 | schema 校验、密码哈希、Tag 排序工具 |
| 集成测试 | pytest + httpx · Vitest + msw | 跨层契约 — API ↔ DB,UI ↔ mock API | POST /tasks 真的写库、TaskList 收到错误时显示 fallback |
| E2E 测试 | Playwright | 用户路径 — 真浏览器跑真服务 | 登录 → 建 task → 标记完成 → 查归档 全流程 |
| 覆盖目标 | 单元 60% + 集成 80% 关键路径 + E2E 覆盖核心用户路径 4–6 条 | ||
Dockerfile · 多阶段构建
# infra/Dockerfile — 一个镜像同时打包前后端,前端构建产物给 FastAPI static 服务 FROM node:22-alpine AS frontend WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build # 出 dist/ FROM python:3.12-slim WORKDIR /app COPY backend/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY backend/ ./backend/ COPY --from=frontend /app/frontend/dist ./backend/static ENV PORT=8080 CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8080"]
GitHub Actions CI
# .github/workflows/ci.yml — PR 卡线,绿了才能合 name: CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: { python-version: "3.12" } - uses: actions/setup-node@v4 with: { node-version: "22" } - run: pip install -r backend/requirements.txt - run: cd frontend && npm ci - run: ruff check backend/ # lint py - run: cd frontend && npm run lint # lint ts - run: mypy backend/ --strict # 类型 - run: pytest --cov=backend --cov-fail-under=80 - run: cd frontend && npm test - run: cd frontend && npx playwright test # E2E deploy: needs: test if: github.ref == "refs/heads/main" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: superfly/flyctl-actions/setup-flyctl@master - run: flyctl deploy --remote-only env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
上线后的 Smoke Test
# 部署完别走人 — 跑 5 个最关键的健康检查 $ URL=https://task-tracker.fly.dev $ curl -sf $URL/healthz # 1. 进程活 $ curl -sf $URL/api/version | jq .commit # 2. 部署的是最新 commit $ curl -sf $URL/api/docs > /dev/null # 3. OpenAPI 可访问 $ curl -sf -o /dev/null -w "%{http_code}\n" $URL/ # 4. 首页 200 $ npx playwright test e2e/smoke.spec.ts \ --config=playwright.prod.config.ts # 5. 关键用户路径
全流程编排
上面四节是动作,这一节是编排—— Hooks / Skills / MCP / Subagent 不是孤立工具,而是协奏曲。 看一个真实场景: 你接到一张 ticket,到 PR 合并、自动部署、Slack 通知, Claude Code 怎么在每一步串起 Day 10–14 学过的能力。
编排全景图
FIG 03 · 全流程编排 — 6 类能力 × 5 个阶段 · 你只在关键节点决策
四件套各自的位置
编辑后必做的"清洁工作"
post-edit hook 自动跑 ruff fmt + mypy + 相关测试。你不用记得格式化,Claude 也不会忘——commit 一定整洁。
把 5 步操作压成 1 句话
项目里 /new-endpoint POST /tasks 自动建 router + schema + 测试 + Alembic 迁移; /ship 跑 lint + test + build + deploy + smoke.
不用切到浏览器找信息
db MCP 让 Claude 直接查 prod schema(只读副本); github MCP 让 Claude 读 issue/PR 评论; slack MCP 让 Claude 发部署通知。
独立任务别串行做
"写 3 个组件 + 1 份 README + 跑覆盖率分析" — 派 4 个 subagent 并行,~10 min 内全收。比串行省 60% 时间。
真实 Ticket 全流程实录
# 假设 ticket #42: "tasks 列表需要支持按 due_date 排序" > 读 GitHub issue #42 的描述,然后给我一份实施方案# MCP · github [mcp_github] 读到了 issue: "用户希望按截止日升降序排,默认升序" > /plan — 这个需求要改哪些文件?需要新加测试吗?# PLAN [Plan] 1. backend/routers/tasks.py 加 order_by 参数 2. backend/tests/test_tasks.py 加 4 个排序测试 3. frontend/src/components/FilterBar.tsx 加排序下拉 4. frontend/e2e/sort.spec.ts 加一条 E2E > 通过,执行 # 进入实现 [Subagent A] 改后端 + 测试 ... [Subagent B] 改前端 + 组件 ... [Hook · post-edit] 自动跑相关测试 ✓ [Hook · post-edit] ruff fmt + mypy ✓ > /pr — 起 PR,标题 "feat(tasks): support order_by"# SKILL [git] 已创建分支 feat/tasks-order-by · push · 开 PR #87 > 派 reviewer subagent 审一下 # SUBAGENT [Reviewer] 发现 1 处: missing index hint — 建议加 db index on (user_id, due_date) > 同意,加上,重新跑 CI [CI · GitHub Actions] All checks passed ✓ — 你点 merge [Deploy] fly deploy — 上线 1m12s [mcp_slack] 已发 #team-eng: "✅ #42 上线 / PR #87 / commit abc1234"
Labs
不实际跑一遍,前面所有内容都只是读过而已。 下面四个 Lab 按 BUILD pipeline 切片,任挑一个项目跟着做—— 技术栈不必和样例一样,关键是体会编排。
Plan 模式画一个小项目
挑你想写的真实小项目(URL 短链 / 番茄钟 / Markdown 笔记...),用 /plan 让 Claude 输出: 目录结构 / 模型 / 端点 / 部署方式 / 工期估算。不要落地——只看 Plan,验证 Claude 是否懂你的意图。
写一份"厚 CLAUDE.md"
给你已有的一个项目重写 CLAUDE.md: 必须含"项目说明 / 编码规范 / 命令清单 / 禁忌"四章,加至少 5 条禁忌(基于你过去栽过的坑)。然后选 3 处让 Claude 改代码,观察它是否真的按规范走。
TDD 实现 + Subagent 并行
选一个端点(如 POST /tasks): 先用 TDD 模式让 Claude 写测试再写实现,完成后派 2 个 subagent并行做 (A) 补集成测试 (B) 写对应前端组件。统计耗时——对比"串行做一遍"的预估时间。
装一条 CI/CD 流水线
给你的项目写 .github/workflows/ci.yml: lint + test + 覆盖率卡线;再装个 /ship Skill,让 Claude 帮你跑本地构建并触发 deploy。完工后假装提一个小 PR,观察 CI 全绿后再 merge。
常见问题
Q · 01 AI-driven 全栈跟传统全栈最本质的差别在哪? +
三处真正的差别: (1) "思考"与"打字"解耦——传统开发里你边想边打,效率被打字速度限制; AI-driven 里你只负责想,Claude 负责打。(2) 规范变成可执行——以前 README 没人看的"代码规范",现在写进 CLAUDE.md 后 Claude 真的会遵守,且会提醒你违反。(3) 并行成本接近 0——Subagent 让你能同时推进 3 件事,这在传统模式下需要 3 个人。
不变的是: 架构、品味、判断、产品感——这些都还得人想。Claude 让你能写"传统模式下需要 3 倍人时"的项目,但不会让你的项目变好 3 倍。瓶颈从"会不会写"变成"想不想得清楚"。
Q · 02 一个人靠 Claude Code 能做多大规模的项目? +
经验数据: 10k–50k 行代码的小型 SaaS 一个人 + Claude Code 全程独立完成是可行的; 这量级以上瓶颈不在编码,而在"你能不能持续装得下整个系统的心智模型"。
具体看三个指标: (1) 会话能否被 Plan + CLAUDE.md 维持上下文一致; (2) 测试覆盖率能否抗住你忘记自己写过什么; (3) Hooks 是否真的能挡住人为失误。三个都过关,你的天花板就是你能想多清楚——不是 Claude 能写多少代码。
Q · 03 该让 Claude 一次写完整个 feature 还是分步? +
三档判断: (1) 单文件、纯增量(给 util 加个函数 / 改一个组件样式)——一次写完。(2) 跨 2-3 个文件、有耦合(加一个 API 端点 + 测试 + 前端调用)——分两段: 先 Plan 看方案,再一次执行。(3) 跨层、有架构影响(加一种新的认证方式 / 重构 DB schema)——必须 /plan,且分多次执行,每段中间 review。
反模式: "把整个 ticket 丢给 Claude 让它一口气干完"——容易出现"看起来都对、跑一下全错"的偏差。Claude 越自由,你越要切片去 review。
Q · 04 怎么避免大项目里 Claude 写出风格不一致的代码? +
三层防线,从软到硬: (1) CLAUDE.md 编码规范章——把命名、结构、错误处理范式明文写; (2) 路径级规则(.claude/rules/)——按目录给不同领域不同提示,backend 和 frontend 有专属规则; (3) Hooks 卡线——post-edit 自动跑 lint / type 检查,不符直接报错。
第四层是给个例子: CLAUDE.md 里贴 1-2 个"标准实现"的代码片段,Claude 会按例仿写。比一千字规则有效。
Q · 05 全栈项目里,什么时候该用 Subagent 而不是直接做? +
满足三个条件之一才派 subagent: (1) 无依赖且并行——3 个组件 / 3 处文案修改,可以同时做; (2) 独立调研——"分析这个老仓库的认证逻辑"——派出去避免污染主上下文; (3) 角色专精——让 reviewer / tester 子代理负责他们擅长的部分。
反过来,有强依赖的串行任务(改 schema → 改路由 → 改前端)别派 subagent。一字之差(schema 字段命名)就让另外两边重做,反而慢。
Q · 06 部署前还需要人工 review 吗?CI 都过了。 +
需要,且永远需要。CI 能验证"代码符合契约",但回答不了"这个变更有没有意义"。Claude 写出 100% 通过测试的代码,也可能解决错了问题(因为它对需求的理解就错了)。
实操: PR 一定要有人(可以是你自己换个时段)读 description + diff 摘要——不必逐行,但必须读懂"它在做什么、为什么这么做、有没有偏离原 issue"。这 3 分钟是 AI-driven 开发里不能省的人工动作。
复习题
- 7 步 build pipeline 中,哪些步骤必须走 Plan 模式?哪些可以直接 Edit?给出理由。
- 项目级 CLAUDE.md 的四个必备章节是什么?为什么"禁忌"通常比"规范"更重要?
- "API 先于 UI" 的开发顺序背后的具体原因是什么?反过来会发生什么?
- 列出 4 件套(Hooks / Skills / MCP / Subagent)在一个典型 ticket 全流程里各自的具体使用场景。
- CI 通过 ≠ 可以合并。给出至少 3 件 CI 检测不到、但 PR review 必须人工把关的事。
自检清单
- 写过一份覆盖"说明 / 规范 / 命令 / 禁忌"四章的厚 CLAUDE.md
- 跑通过 Plan 模式 → 落地 → 复盘的完整循环
- 在一个真实项目里跑通了 7 步 build pipeline 中至少 5 步
- 用 Subagent 完成过至少一个并行任务(同时改 3 处以上)
- 配置了至少 1 个 PostToolUse Hook 自动跑 lint / test
- 写过至少 1 个项目级 Skill,封装重复出现的 5+ 步操作
- 配过至少 1 个 MCP server,让 Claude 能查 db / GitHub / Slack 其中之一
- 项目有完整的 README + Dockerfile + CI workflow,能在云上跑起来
延伸阅读
Anthropic · Claude Code Cookbook
官方维护的真实场景配方集: 从单文件 CLAUDE.md 到完整 monorepo 配置,有大量可直接 fork 的模板。
FastAPI + React Monorepo Starter
社区维护的全栈起手仓: 含 Dockerfile / GitHub Actions / pre-commit / VS Code 工作区配置,clone 即用。
The Twelve-Factor App
SaaS 设计的"圣经": 配置走 env、日志走 stdout、依赖明示、无状态进程——这些原则在 AI-driven 项目里更重要。
Day 18 预告
遗留代码与大型仓库 — 当代码不是你写的
今天你从零造了一个新项目——明天面对一个十年代码库。 用 Subagent 做"代码考古"摸清架构、用 MCP 拉 git history 还原决策、用 Plan 模式设计渐进式重构、 用 Hooks 在改老代码时强制走兼容路径——把"接手陌生项目"从一周的折磨变成两小时的导览。