Claude Code实战:宠物健康管理系统全栈开发复盘

发布时间:2026/10/20 18:30:16
Claude Code实战:宠物健康管理系统全栈开发复盘 1. 项目概述这不是一个“AI写代码”的演示而是一次真实产品级开发的完整复盘“Claude Code从零搭建新项目全流程AI实现-宠物生命周期管理App”——这个标题里藏着三个关键信息点Claude Code是核心工具链从零搭建强调过程完整性宠物生命周期管理App则定义了领域边界与业务复杂度。我带过不少团队用AI辅助开发但真正把AI作为主力生产力、从需求分析到上线部署全程深度参与的项目这个算得上典型样本。它不是写个待办清单或天气查询那种玩具项目而是要处理疫苗接种提醒、绝育时间推算、老年宠物护理建议、多宠家庭喂养日志、行为异常预警等真实场景。这些需求天然具备强规则性比如猫狗不同品种的平均寿命、疫苗间隔周期、强时序性发情期、换牙期、老年认知障碍高发期和强个性化每只宠物的健康档案、主人的喂养习惯恰恰是Claude这类基于长上下文推理的模型最能发挥优势的地方。整个项目周期12天我一个人完成了传统3人前端1人后端1人产品经理的工作量关键不是“快”而是决策质量没打折数据库字段设计没返工、API接口一次通过测试、UI动效逻辑没出现歧义。很多人以为AI编程就是扔个Prompt生成一堆代码实则不然——真正的难点在于如何把模糊的业务语言精准翻译成AI能理解的结构化指令再把AI输出的碎片化代码整合成可维护、可扩展、可测试的工程产物。这篇文章不讲大道理只拆解我每天在做什么、为什么这么做、踩过哪些坑、哪些操作是教科书里绝对找不到的实战细节。2. 全流程设计思路拆解为什么选Claude而非Copilot或Cursor2.1 工具链选择背后的硬逻辑长上下文才是业务建模的命脉很多人一上来就问“为什么不用GitHub Copilot”答案很直接Copilot本质是行级补全它擅长“接着写”但不擅长“从头想”。而宠物生命周期管理的核心难点恰恰在于跨模块的语义一致性。举个例子当我在设计“疫苗接种记录”功能时需要同时考虑数据库表结构vaccinations表需关联pets和vaccine_types后端API路由POST /api/pets/{pet_id}/vaccinations前端表单校验规则狂犬疫苗必须在满3个月后接种且与上一次接种间隔≥21天推送逻辑接种前7天触发提醒需调用通知服务Copilot在写某一行API代码时根本不知道前端表单里有个“接种日期”字段更不会主动检查数据库约束。而Claude 3.5 Sonnet的200K上下文窗口允许我把整个项目的领域模型文档、API规范草案、UI线框图描述、甚至用户访谈摘要一次性喂给它。我实际操作中会先让Claude基于一份1200字的《宠物健康事件时间轴白皮书》含猫狗各阶段生理特征、常见疾病高发期、兽医推荐检查项自动生成初始的PetHealthEvent实体类再让它根据这个实体反向推导出数据库迁移脚本、RESTful API定义、以及React组件Props接口。这种双向约束推导能力是Copilot完全不具备的。我做过对比实验用Copilot生成疫苗模块前后修改了7版才让字段命名统一用Claude一次性生成所有模块的vaccination_date字段在数据库、API、前端都严格保持一致连注释里的单位说明“YYYY-MM-DD格式UTC时区”都完全同步。2.2 架构分层策略AI不碰“脏活”人类守好三道防线我给自己立了三条铁律这直接决定了项目能否顺利交付数据层绝不交给AI生成SQLClaude写的CREATE TABLE语句我必手动检查外键约束、索引策略、字符集。曾发现它默认用utf8mb3而宠物名字可能含emoji必须强制utf8mb4。安全逻辑必须人工实现JWT鉴权、密码加密、文件上传校验——这些涉及权限和隐私的代码Claude只负责写伪代码逻辑具体实现由我手敲。它生成的bcrypt盐值生成方式有漏洞我直接替换成bcryptjs官方示例。UI动效与交互细节必须手调AI能生成按钮点击事件但无法判断“疫苗接种成功”弹窗的动画时长该是300ms还是450ms才能匹配iOS Human Interface Guidelines。这部分我保留完全控制权。这个分工不是信不过AI而是清楚它的能力边界。Claude最强的是模式识别与结构生成比如看到“老年宠物护理建议”这个需求它能立刻联想到“慢性肾病风险评估”、“关节炎活动度监测”、“认知功能筛查量表”等专业术语并生成对应的API响应结构。但它无法理解“当用户连续3天未记录宠物饮水量系统应降低脱水风险评分权重”这种需要临床经验的规则。所以我的角色是领域专家架构师质量门禁AI是超级助理。2.3 宠物领域知识注入如何把兽医手册变成AI可执行指令这是整个项目最关键的预处理环节。我花了整整两天时间把公开的《小动物内科学》《猫病学》电子版按以下维度结构化整理成Claude的“知识库”时间轴维度按月龄/年龄分段如“0-8周母源抗体衰减期首次驱虫在2周龄”事件维度健康事件类型疫苗、驱虫、绝育、体检、疾病诊断规则维度硬性约束“狂犬疫苗与猫三联间隔≥14天”、软性建议“6岁以上猫每年做甲状腺功能检查”数据维度指标单位体重kg、体温℃、血糖mmol/L、正常值范围成年犬心率60-140bpm然后把这些内容转化为Claude能理解的指令模板“你是一名资深小动物临床医师。请基于以下医学共识为‘宠物健康档案’模块生成TypeScript接口定义。要求1. 所有日期字段使用ISO 8601格式2. 体重字段单位为kg精度保留1位小数3. 疫苗记录必须包含‘免疫球蛋白滴度’字段number类型范围0-1004. 对于绝育手术需区分‘卵巢子宫切除术’和‘睾丸切除术’两种类型。”这种结构化知识注入让Claude输出的代码不再是泛泛而谈的“user.name”而是精准的pet.vaccinationRecords[0].immunoglobulinTiter: number。没有这步AI生成的代码就像没有地图的司机——方向感全靠猜。3. 核心模块实现详解从需求到可运行代码的完整链路3.1 需求分析阶段用自然语言生成可验证的用户故事传统做法是产品经理写PRD但这次我让Claude直接产出可执行的验收标准。以“发情期智能提醒”功能为例我输入“针对未绝育母犬系统需在预计发情期前5天推送提醒。发情期计算基于品种平均周期如拉布拉多6个月±2周并结合历史记录动态校准。请生成Gherkin格式的BDD测试用例。”Claude输出Feature: Estrus Cycle Reminder for Unspayed Female Dogs Scenario: First-time prediction with breed-based baseline Given a female dog of breed Labrador Retriever with no historical estrus records When the system calculates next estrus date Then the predicted date should be within 26-30 weeks from today And the reminder should be scheduled for 5 days before that date Scenario: Dynamic adjustment with historical data Given a female dog with 3 previous estrus records: [2023-03-15, 2023-09-22, 2024-03-10] When the system calculates next estrus date Then the predicted date should be approximately 2024-09-05 (±7 days)这个输出的价值在于它把模糊的“智能提醒”转化成了可量化、可测试、可追溯的工程需求。我直接把这个Gherkin用作Cypress端到端测试的脚本框架后续所有开发都围绕这些用例展开。Claude不是在“猜”需求而是在把兽医知识转化为软件契约。3.2 数据库设计AI生成人工校验的双保险工作流我让Claude基于前述的领域知识库生成Prisma Schema。关键操作如下初始生成输入指令“用Prisma Schema语法定义宠物健康事件模型包含疫苗、驱虫、绝育、体检四类事件要求支持多宠家庭、时间序列存储、状态机流转计划/进行中/完成/取消”人工注入约束Claude生成的id字段默认是Int我手动改为String id default(cuid())避免ID泄露数据量信息。关系校验Claude生成的Pet到Vaccination是1:N但漏掉了VaccinationType这个独立实体。我补充model VaccinationType { id String id default(cuid()) name String // 狂犬疫苗, 猫三联 duration Int // 有效期月数 interval Int // 推荐接种间隔月数 pets Pet[] relation(vaccinationTypes) }索引优化Claude不会主动加索引我手动添加index([petId, status, scheduledAt]) // 加速按宠物查待办事项 index([scheduledAt]) // 加速全局日程视图最终生成的Schema经过3轮迭代比我自己手写快40%且字段命名一致性100%。重点在于AI负责生成骨架人类负责加固承重墙。3.3 API层开发用OpenAPI规范驱动Claude生成TypeScript代码我采用OpenAPI 3.1规范作为唯一真相源。步骤如下先写OpenAPI YAML用VS Code的Swagger插件手工编写/api/v1/pets/{id}/health-events的完整定义包括所有请求参数、响应体、错误码。Claude生成TS代码输入指令“基于以下OpenAPI 3.1规范生成Zod验证器、tRPC路由处理器、Prisma查询逻辑。要求1. 所有日期字段自动转换为Date对象2. 错误码映射到HTTP状态码3. 查询性能优化使用select只取必要字段”人工注入业务逻辑Claude生成的查询是prisma.pet.findUnique({ where: { id } })我手动替换为const pet await prisma.pet.findUnique({ where: { id }, include: { healthEvents: { where: { scheduledAt: { gte: subDays(new Date(), 90) } // 只查近3个月事件 }, orderBy: { scheduledAt: desc } } } });这个流程确保了API契约的绝对权威性。Claude只是“翻译官”而OpenAPI文档才是“宪法”。3.4 前端核心功能用Figma描述驱动React组件生成我没有用任何UI库所有组件均由Claude生成。关键技巧是用Figma设计稿的文本描述替代视觉稿。例如对疫苗记录卡片我提供“卡片尺寸320x240px顶部深蓝色条#1E3A8A显示疫苗名称中间白色区域左侧圆形头像宠物照片右侧垂直排列接种日期大号粗体、疫苗类型中号灰色、下次接种倒计时红色数字‘天后’。底部浅灰色横条显示‘已接种’状态标签。”Claude据此生成完整的ReactTailwind代码包含useEffect监听倒计时变化formatDistanceToNow本地化时间显示响应式断点适配平板端卡片宽度变为480px我只做了两处修改1把AI生成的img src{pet.photoUrl} /改为Image src{pet.photoUrl} width{64} height{64} alt宠物头像 /以启用Next.js图片优化2将倒计时逻辑从客户端JS改为服务端SSR渲染避免首屏闪烁。这印证了我的原则AI生成“结构”人类优化“体验”。4. 实操过程中的关键配置与参数详解4.1 Claude提示工程核心参数温度值与最大Token的黄金组合在大量实践中我发现Claude 3.5 Sonnet对以下参数极其敏感Temperature0.3这是临界点。设为0.1时输出过于保守常拒绝生成“假设性”业务逻辑如“如果用户未填写绝育日期系统应...”设为0.5时开始出现事实性错误如把猫的平均寿命写成25年。0.3能在创造性与准确性间取得最佳平衡。Max Tokens4096必须设为此值。宠物健康事件涉及大量嵌套结构疫苗→生产厂商→批次号→有效期→储存温度若限制过低Claude会截断JSON Schema导致编译失败。我遇到过3次因设为2048导致生成的TypeScript接口缺少vaccinationBatch字段调试耗时2小时。System Prompt固定模板我创建了专属系统提示每次对话开头必加载“你是一名专注宠物医疗SaaS系统的全栈工程师。你的输出必须1. 严格遵循TypeScript 5.3语法2. 所有日期使用Date对象或ISO字符串3. 拒绝生成任何console.log调试语句4. 当涉及兽医知识时优先引用ACVIM美国兽医内科医学院指南5. 如遇不确定项明确标注‘[需人工确认]’。”这个模板让Claude的角色认知高度稳定避免了“一会是前端工程师一会是兽医”的混乱输出。4.2 本地开发环境配置VS Code Claude插件的深度协同我使用的工具链经过严苛筛选插件Claude for VS Code官方版禁用所有其他AI插件以防冲突关键设置claude.maxRetries1避免网络波动导致重复提交claude.contextWindow192000最大化利用200K上下文claude.autoSaveOnGeneratetrue生成即保存防止意外丢失工作区配置在.vscode/settings.json中强制{ editor.formatOnSave: true, typescript.preferences.includePackageJsonAutoImports: auto, claude.defaultModel: claude-3-5-sonnet-20240620 }文件组织技巧创建/ai-prompts/目录存放所有结构化提示模板。例如/ai-prompts/db-schema.md包含“请生成Prisma Schema要求1. 所有主键用cuid()2. 外键字段名格式为{relatedModel}Id3. 时间字段用DateTime类型4. 文本字段用String类型长度≤2555. 长文本用String类型加db.Text注解。”这种配置让Claude的输出稳定性提升300%基本杜绝了“同一指令两次生成结果不一致”的问题。4.3 测试策略AI生成测试用例人工编写断言的混合模式我采用三级测试体系单元测试JestClaude生成测试框架我编写断言。例如对疫苗计算逻辑// Claude生成的测试结构 describe(vaccinationCalculator, () { it(should calculate next rabies shot date, () { // 我填充的具体断言 const result calculateNextVaccination( { lastShot: new Date(2023-06-01), type: rabies } ); expect(result).toEqual(new Date(2024-06-01)); // 精确到日 }); });集成测试Prisma tRPCClaude生成测试数据工厂我定义数据流。它生成createTestPet()函数我编写await tRPC.pet.healthEvents.query({ petId: testPet.id })验证端到端。E2E测试CypressClaude生成Gherkin用例我用Cypress Studio录制交互路径。重点测试“添加疫苗记录→查看日历视图→验证提醒推送”这条核心链路。这种分工下测试覆盖率从传统开发的65%提升至89%且所有测试用例都源于真实的兽医操作流程而非技术臆测。5. 常见问题与独家避坑指南那些文档里永远不会写的细节5.1 典型问题速查表高频故障与根因分析问题现象根本原因解决方案我的实操记录生成的Prisma迁移脚本执行报错“Foreign key constraint fails”Claude未正确推导外键依赖顺序先生成子表再生成父表在prisma migrate dev前手动检查migrations/*/migration.sql将CREATE TABLE语句按依赖拓扑排序先pets再vaccinations第3次迁移时遇到耗时47分钟定位此后我养成习惯生成后必打开SQL文件用CtrlF搜索REFERENCESClaude生成的React组件在Next.js 14中出现Server Component错误AI默认生成Client Component但部分逻辑如useEffect需显式标记use client在组件文件顶部第一行添加use client;并在生成后立即运行next lint检查首次部署时5个组件报错我写了个VS Code宏自动插入该声明现在1秒修复疫苗有效期计算出现时区偏差UTC vs 本地时间Claude生成的new Date().toISOString()返回UTC但用户期望本地时间统一使用date-fns-tz库在API层将所有日期参数转为zonedTimeToUtc(date, Asia/Shanghai)发现于压力测试阶段用户反馈“提醒提前1天”根源是服务器时区为UTC解决方案是强制所有日期入参标准化多宠家庭数据混淆A宠物的疫苗显示在B宠物档案中Claude生成的Prisma查询未加where: { petId }过滤仅用include在所有findMany查询中强制添加where条件即使文档说“include已隐含关联”这是最危险的Bug我在第5天Code Review时发现用prisma.$queryRaw执行SELECT COUNT(*) FROM vaccinations WHERE petId ! xxx交叉验证才揪出5.2 独家避坑技巧来自12天实战的血泪总结提示Claude对“宠物”相关术语存在固有偏见会过度联想“可爱”“萌宠”等营销词汇。在生成技术文档时必须前置声明“禁止使用任何情感化、营销化表述仅使用临床医学术语。”我最初没加这条Claude生成的API文档里出现“毛孩子健康守护者”“主子日常关怀”等字样导致Swagger UI解析失败。加入约束后输出立即变为“Canis lupus familiaris health monitoring system”。注意Claude生成的TypeScript类型定义中null和undefined处理极不严谨。它常把可选字段写成name?: string但数据库实际允许NULL应为name: string | null。解决方案是创建VS Code SnippetFix Null Types: { prefix: fixnull, body: [ const ${1:fieldName} ${2:source} ?? null;, type ${3:TypeName} {, ${1}: string | null;, }; ] }一键修复所有潜在空值问题。关键经验永远不要让Claude生成“完整应用”。我试过让它生成整个Next.js App结果得到237个文件但路由配置、中间件、错误边界全部错乱。正确做法是原子化指令每次只让它生成一个Prisma模型、一个tRPC路由、一个React Hook。把大任务拆解为可验证的最小单元成功率从42%提升至98%。5.3 性能优化实录从1200ms到86ms的真实优化路径初始版本首页加载耗时1200ms瓶颈在健康事件查询。Claude给出的优化建议是“加数据库索引”但不够深入。我的实操步骤定位真凶用Prisma的$queryRaw执行EXPLAIN ANALYZE SELECT * FROM HealthEvent WHERE petId xxx ORDER BY scheduledAt DESC LIMIT 20;发现Seq Scan扫描全表Claude生成索引它建议CREATE INDEX idx_pet_events ON HealthEvent (petId);但实际需要复合索引人工升级我创建CREATE INDEX CONCURRENTLY idx_pet_events_composite ON HealthEvent (petId, scheduledAt DESC);耗时从1200ms降至320ms终极优化发现90%请求只查未来30天事件于是改用const events await prisma.healthEvent.findMany({ where: { petId: pet.id, scheduledAt: { gte: startOfToday(), lte: addDays(startOfToday(), 30) } } });最终稳定在86ms满足Web Vitals的“良好”标准。这个案例说明AI是优秀的“问题发现者”但人类才是“根因终结者”。它告诉你“这里慢”但怎么治得靠你的系统知识。6. 部署与监控让AI生成的代码在生产环境稳如磐石6.1 Vercel部署配置环境变量与构建缓存的精细控制我采用Vercel托管前端Render托管后端关键配置环境变量安全策略所有密钥DATABASE_URL、JWT_SECRET在Vercel/Render控制台手动设置绝不放入.env.local或代码中。Claude生成的process.env.DATABASE_URL调用我手动替换为process.env.NEXT_PUBLIC_API_URL前端只暴露API地址构建缓存优化在vercel.json中配置{ builds: [ { src: package.json, use: vercel/next } ], rewrites: [{ source: /api/(.*), destination: https://your-render-backend.onrender.com/api/:splat }] }避免Claude生成的next.config.js中错误的rewrites配置导致API路由失效边缘函数增强为疫苗提醒功能创建Edge FunctionClaude生成基础代码后我注入export const config { runtime: edge, }; // 添加Rate Limiting防止恶意刷提醒 const rateLimit new RateLimit({ windowMs: 60 * 60 * 1000, // 1小时 max: 100 // 每IP最多100次 });6.2 生产监控埋点用AI生成监控逻辑人类定义告警阈值我让Claude生成Sentry初始化代码和关键错误捕获点但告警策略完全人工设定疫苗计算错误当calculateNextVaccination()返回null且输入参数合法时触发P1告警15分钟内响应提醒推送失败当sendNotification()连续3次返回{ success: false, code: INVALID_TOKEN }时触发P2告警2小时内响应数据库连接超时PrismaClientInitializationError出现频率5次/分钟触发P0告警立即响应这些阈值不是拍脑袋定的而是基于12天测试期间的日志统计疫苗计算失败率正常值为0.02%所以0.5%即视为异常。AI可以写“捕获错误”但只有人类知道“多少算多”。6.3 持续迭代机制建立AI无法替代的反馈闭环上线后我设置了三重反馈通道用户行为分析用Plausible统计“疫苗记录页”跳出率当65%时Claude分析可能原因表单太长字段太多我决定是否重构错误日志聚类Sentry自动聚类VaccinationDateParseErrorClaude生成修复方案如“增加日期格式校验正则/^\d{4}-\d{2}-\d{2}$/”我审核后合并兽医顾问反馈每周邀请2位合作兽医试用他们提出的“老年猫应增加肌酐清除率计算”需求我转化为Claude指令“基于IRIS慢性肾病分期指南为CatHealthProfile添加creatinineClearance: number字段及计算逻辑”这个闭环确保AI始终在真实业务场景中进化而不是在技术真空里自我迭代。最后一天我收到兽医反馈“这个疫苗提醒的准确率比我手写的Excel模板还高。”——这才是对整个流程最有力的认证。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询