ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高手进阶(八):毕业设计Claude Code全栈实战:2天交付一个完整SaaS

高手进阶(八):毕业设计Claude Code全栈实战:2天交付一个完整SaaS 1. 毕业设计场景下 Claude Code 全栈交付的真实痛点毕业设计最要命的不是不会写代码而是时间不够用。答辩前两周你还在纠结到底用 Next.js 还是 Vue等框架定下来数据库设计、鉴权、部署又各占三天最后留给写论文的时间只剩通宵。我见过太多同学把 80% 的精力耗在环境配置和重复的 CRUD 上真正体现技术含量的业务逻辑反而草草收场。Claude Code 这类终端 Agent 的价值就在这里它能读懂你的项目结构、按你的架构决策生成代码、跑测试、修报错把写样板代码这件事压缩到原来的三分之一。但前提是你得会编排它——不是丢一句帮我写个 SaaS就等结果而是像带一个刚入职的实习生先对齐需求再定架构然后一个模块一个模块地验收。这篇要交付的是一个叫 TaskFlow 的待办事项 SaaS技术栈是 Next.js 15App Router FastAPI PostgreSQL功能覆盖注册登录、工作区、项目、任务看板拖拽、成员邀请、仪表盘统计。目标是在两天内跑通一个能演示、能部署、能讲清楚架构的完整产品。适合已经用过 Claude Code 基础功能、想把它真正用在一个完整项目上的同学。全程我会给出可复制的目录结构、关键配置文件和逐条验证命令模型调用统一走 TaoToken 的 Key 和 API 通道省去你到处找 Key、配环境变量的麻烦。先说清楚两天的时间怎么分第一天上午做需求推演和数据库设计下午写后端第二天上午写前端下午联调、部署、配 CI。听起来紧但每一步都有 Claude Code 兜底真正卡人的地方我会在第五节把常见报错列全。2. TaoToken 前置统一 Key 与 API 通道配置在动手写代码之前先把模型调用的通道打通。很多同学卡在这一步Claude Code 默认走 Anthropic 官方端点但你可能想用更划算的模型或者团队里几个人共用一套额度。TaoToken 提供的就是一个统一的 Key 和 API 通道你只需要在环境变量里改一个 Base URLClaude Code 的所有请求就会走这条通道。先注册并拿到 Key。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建一个 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 列表在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建时给它起个能认出来的名字比如taskflow-dev方便后面区分开发和生产。拿到 Key 之后配置 Claude Code 的环境变量。Windows 用 PowerShellmacOS/Linux 用 export二选一# Windows PowerShell —— 当前会话生效 $env:ANTHROPIC_BASE_URL https://taotoken.net/api $env:ANTHROPIC_API_KEY sk-你的Key# macOS / Linux export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key注意 Base URL 是https://taotoken.net/api不要加多余的路径后缀。配完之后验证一下通道是否通claude -p 回复 OK 两个字母即可 --max-turns 1如果返回OK说明通道正常。如果报 401先检查 Key 有没有复制完整前后不要有空格再检查 Base URL 有没有写错。这一步过了后面所有代码生成、审查、测试都走这条通道。如果你更习惯在网页里先试模型效果可以打开模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 选一个模型发一条消息确认额度可用。这一步不是必须的但能帮你快速判断是 Key 的问题还是网络的问题。对于长期要跑编码任务、Agent 任务的场景建议看一下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它比按量计费更适合连续几天的高强度开发。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到配置细节可以对照查。这里要强调一点TaoToken 是模型调用的统一通道不是让你绕过什么限制它解决的是多个模型、多个项目、多人协作时 Key 管理混乱的问题。你把它理解成一个统一的 API 网关就行。3. 可复制配置项目骨架与关键配置文件这一节给你可以直接抄的配置。先建项目目录结构如下taskflow/ ├── CLAUDE.md # AI 记忆文件约 80 行 ├── ARCHITECTURE.md # 架构决策记录 ├── frontend/ # Next.js 15 │ ├── src/ │ │ ├── app/ │ │ │ ├── layout.tsx │ │ │ ├── page.tsx # 仪表盘 │ │ │ ├── login/page.tsx │ │ │ ├── projects/[id]/page.tsx # 看板 │ │ │ └── actions/ # Server Actions │ │ ├── components/ │ │ │ ├── ui/ # shadcn/ui │ │ │ ├── TaskCard.tsx │ │ │ └── ProjectBoard.tsx │ │ └── lib/api-client.ts │ └── package.json ├── backend/ # FastAPI │ ├── app/ │ │ ├── main.py │ │ ├── config.py │ │ ├── database.py │ │ ├── api/v1/endpoints/ │ │ ├── models/ │ │ ├── schemas/ │ │ └── services/ │ ├── alembic/ │ ├── tests/ │ └── requirements.txt └── .github/workflows/ ├── pr-review.yml └── test.yml先写CLAUDE.md这是 Claude Code 每次会话都会读的记忆外骨骼。控制在 200 行以内只写它无法从代码推断的信息# TaskFlow 项目约定 ## 技术栈 - 前端Next.js 15 App Router Tailwind shadcn/ui - 后端FastAPI SQLAlchemy 2.0 (async) Alembic - 数据库PostgreSQL 15 - 认证JWT HttpOnly Cookie ## 目录约定 - 后端业务逻辑放 services/路由只做参数校验和调用 - 前端数据获取优先用 Server Components交互用 Client Components - 所有 API 请求走 lib/api-client.ts不要散落 fetch ## 已知坑 - async SQLAlchemy 必须设 expire_on_commitFalse - Alembic 检测不到 JSONB 的 default[]要手动加 server_default - Next.js 15 的 fetch 默认不缓存第三方客户端要显式 cache: no-store ## 常用命令 - 后端启动uvicorn app.main:app --reload - 后端测试pytest tests/ -v - 迁移alembic revision --autogenerate -m msg alembic upgrade head - 前端启动npm run dev后端最关键的配置文件是backend/app/database.py这里踩坑最多from sqlalchemy.ext.asyncio import ( AsyncSession, async_sessionmaker, create_async_engine ) from app.config import settings engine create_async_engine( settings.database_url, pool_size10, max_overflow20, pool_pre_pingTrue, # 生产必须验证连接有效性 pool_recycle3600, # 1 小时回收连接 ) AsyncSessionLocal async_sessionmaker( engine, class_AsyncSession, expire_on_commitFalse, # async 下必须否则提交后懒加载报 MissingGreenlet ) async def get_db() - AsyncSession: async with AsyncSessionLocal() as session: try: yield session await session.commit() except Exception: await session.rollback() raiseexpire_on_commitFalse这一行是 async SQLAlchemy 最容易漏的。不设它commit 之后访问任何对象属性都会触发MissingGreenlet错误而且报错位置和真正原因隔得很远新手能查半天。前端的环境变量配置在frontend/.env.localNEXT_PUBLIC_API_URLhttp://localhost:8000注意NEXT_PUBLIC_前缀。没有这个前缀Client Component 里读到的是undefined请求会发到错误地址。这个坑在 Vercel 部署时会再犯一次第五节细说。如果你用 Cline 或 CC Switch 这类工具管理多个模型通道配置三件套要写全Base URL 填https://taotoken.net/apiKey 填你的sk-开头字符串Model ID 填你在控制台选定的模型标识。三个缺一个都连不上报错通常是 401 或 model not found。4. 验证请求与成功结果从注册到看板跑通配置写完逐条验证。先起后端cd backend python -m venv .venv .venv/Scripts/activate # Windows # source .venv/bin/activate # macOS/Linux pip install -r requirements.txt uvicorn app.main:app --reload看到Uvicorn running on http://127.0.0.1:8000就对了。测试注册接口curl -X POST http://localhost:8000/api/v1/auth/register \ -H Content-Type: application/json \ -d {email:testexample.com,username:test,password:Test1234!}返回{id:...,email:testexample.com,username:test}说明注册通了。再测登录确认能拿到 token 并设置 Cookiecurl -X POST http://localhost:8000/api/v1/auth/login \ -H Content-Type: application/json \ -c cookies.txt \ -d {email:testexample.com,password:Test1234!}-c cookies.txt会把 Cookie 存下来后面带-b cookies.txt就能访问需要认证的接口。测一下获取当前用户curl http://localhost:8000/api/v1/users/me -b cookies.txt返回用户信息就说明 JWT Cookie 链路通了。接着起前端cd frontend npm install npm run dev打开http://localhost:3000应该能看到登录页。用刚才注册的账号登录进入仪表盘创建一个项目进项目看板新建几个任务拖拽到不同列。拖拽后刷新页面任务还在新位置说明PATCH /tasks/reorder的乐观更新和持久化都正常。后端测试跑一遍cd backend pytest tests/ -v全绿就说明核心逻辑没问题。如果某个测试挂了把报错原文贴给 Claude Code让它定位——这是它最擅长的场景比你自己一行行 debug 快得多。数据库迁移验证alembic downgrade -1 alembic upgrade head能来回切换说明迁移脚本没问题。这一步很重要答辩时老师很可能问你数据库怎么管理的你能现场演示迁移回滚比嘴上说用了 Alembic有说服力得多。5. 本篇常见错排查真实报错对照这一节把全流程最容易撞的报错列全每条都给根因和修法。401 Unauthorized / invalid api key先确认ANTHROPIC_API_KEY有没有多余空格再确认ANTHROPIC_BASE_URL是不是https://taotoken.net/api。如果是在 CI 里报 401检查 GitHub Secrets 里的名字和 YAML 里引用的名字是否一致。还有一种情况是 Key 被删了或额度用完去控制台看一眼。local proxy failed / connection refused通常是 Base URL 写成了带路径的形式比如https://taotoken.net/api/v1多出来的/v1会导致路由匹配失败。改成https://taotoken.net/api即可。另外检查本机有没有设置HTTP_PROXY之类的环境变量有的话先清掉。reading choices: unexpected end of JSON input这个报错一般出现在流式响应被中途截断时。常见原因是max_turns设得太小任务没跑完就被强制停止。把--max-turns调到 10 左右或者去掉这个参数让它自然结束。如果是网络抖动导致的重试一次通常就好。OAuth error / authentication failed如果你之前登录过 Claude Code 的官方账号本地可能缓存了旧的凭证。清掉~/.claude下的配置重新用环境变量方式配置。CC Switch 这类工具切换通道时也要注意切换后重启终端让环境变量生效。MissingGreenlet前面说过async SQLAlchemy 没设expire_on_commitFalse。还有一种情况是在同步函数里调了await检查调用链上每一层是不是都是async def。CORS blockedFastAPI 的 CORS 中间件只设了allow_origins不够POST 请求前浏览器会发 OPTIONS 预检需要同时设allow_methods和allow_headersapp.add_middleware( CORSMiddleware, allow_origins[http://localhost:3000], allow_credentialsTrue, allow_methods[*], allow_headers[*], )position 唯一约束冲突拖拽排序时如果逐条 UPDATE position中间状态会出现两条记录 position 相同触发唯一约束。改成一条 SQL 批量更新UPDATE tasks SET position v.position FROM (VALUES (...), (...)) AS v(id, position) WHERE tasks.id v.id::uuid AND tasks.project_id :project_idJSONB null 约束冲突Alembic 的--autogenerate检测不到default[]因为空列表是 Python 可变对象。手动在迁移脚本里加server_defaulttext([]::jsonb)。Vercel 部署后请求发到 localhost环境变量少了NEXT_PUBLIC_前缀。加上前缀后必须重新部署因为NEXT_PUBLIC_*是在构建时注入的改完不重新构建不生效。Next.js 显示过期数据Next.js 15 的 fetch 默认不缓存但第三方 HTTP 客户端可能有自己的缓存。所有请求显式加cache: no-storemutation 后调revalidatePath()。6. 部署上线与后续迭代本地跑通之后部署是最后一道坎。前端推 Vercelcd frontend npx vercel --prodVercel 会自动识别 Next.js零配置。部署完去 Dashboard 设置环境变量NEXT_PUBLIC_API_URL指向后端地址然后重新部署一次。后端推 Railwaycd backend railway upRailway 自动检测 Python 项目从requirements.txt装依赖。加一个Procfileweb: uvicorn app.main:app --host 0.0.0.0 --port $PORT数据库用 Railway 提供的 PostgreSQL 插件把连接串填到后端的环境变量DATABASE_URL里。注意连接串要用postgresqlasyncpg://前缀因为 SQLAlchemy 的 async 引擎需要指定驱动。CI 用 GitHub ActionsPR 打开时自动跑测试和代码审查。审查那一步复用 Claude Code 的 headless 模式name: PR Review on: pull_request: types: [opened, synchronize] jobs: review: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Claude Code Review env: ANTHROPIC_API_KEY: ${{ secrets.TAOTOKEN_API_KEY }} ANTHROPIC_BASE_URL: https://taotoken.net/api run: | npx claude -p 审查本次 PR 的代码变更关注安全性、正确性、性能 \ --allowedTools Read,Glob,Grep,Bash(git diff) \ --max-turns 5 --output-format json review.json注意ANTHROPIC_BASE_URL在 CI 里也要设成 TaoToken 的地址Key 存在 GitHub Secrets 里。这样团队里任何人提 PR 都会自动审查答辩时你可以现场演示这个流程比单纯展示代码更有说服力。部署完之后把线上地址、测试账号、架构图整理进论文的系统实现章节。Claude Code 生成的代码你都要能讲清楚为什么这么写——答辩老师问的不是你会不会用 AI而是你懂不懂你交的东西。建议在ARCHITECTURE.md里记录每个关键决策的理由比如为什么 tags 用 JSONB 而不是关联表、为什么 JWT 验证不查库这些就是你答辩时的弹药。后续迭代可以接 Coding Plan 继续做比如加实时协作、加通知系统、加数据导出。有了这套骨架和 CI加功能就是重复写文档 → 生成代码 → 测试 → 提交的循环速度会越来越快。
返回列表