背景痛点:一个人打全场,时间却只剩 30 天
毕设网站听起来只是“做个小系统”,真动手才发现处处是坑。去年我带 12 名学弟妹做校内抽检,90% 的延期原因集中在三点:
- CRUD 重复编码:用户、角色、文章、评论四张表写完,发现还有“收藏”“点赞”两张表,复制粘贴到眼花,一改需求全崩。
- 环境配置复杂:Windows 装 Node 18、Python 3.11、MySQL 8、Redis 7,版本冲突把 PATH 撑爆,凌晨三点还在搜“npm ERR! gyp”。
- 缺乏测试意识:本地跑通就 push,上云 502,回滚找不到稳定节点,答辩前夜通宵改 SQL,现场演示直接 404。
时间被切割成碎片,真正思考架构只剩 10%,于是“能跑就行”变成最高优先级,技术债滚雪球,最后连导师都看不下去。
技术选型对比:手撸、低代码还是 AI 协同?
我把同一套“毕设网站”需求(用户注册、JWT 登录、文章 CRUD、管理后台、响应式前端)拿给三组同学做对照实验,周期两周,结果如下:
| 维度 | 纯手动 | 低代码(某云) | AI 辅助(Copilot + GPT-4) |
|---|---|---|---|
| 代码行数 | 3.2k | 0.8k(平台生成) | 1.4k(人工+AI) |
| 可维护性 | 中(耦合高) | 低(黑盒) | 高(Clean Code+单测) |
| 学习成本 | 高(踩坑多) | 低(拖拽即可) | 中(需 Prompt 技巧) |
| 自由扩展 | 高 | 低(受平台限制) | 高(随时改源码) |
| 平均日报工时 | 8.5 h | 3.2 h | 4.1 h |
结论:低代码适合“交差”,AI 协同才是“学到东西又写得快”的折中方案——代码可见、可改、可测试,且能把重复体力活压到 30% 以下。
核心实现:让 AI 当“结对编程伙伴”
下面以“文章模块”为例,演示如何把需求一句话喂给 AI,再拿到符合 Clean Code 的骨架。
1. 需求 → Prompt
用 FastAPI 实现文章 CRUD,要求:RESTful、依赖注入、幂等更新、自动验证、分页、软删除、JWT 鉴权,返回统一格式。
2. AI 生成(节选)
# app/routers/post.py from typing import List from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from app import crud, schemas from app.api import deps from app.core.security import get_current_user router = APIRouter() @router.post("/", response_model=schemas.PostRead, status_code=201) def create_post( *, db: Session = Depends(deps.get_db), post_in: schemas.PostCreate, current_user=Depends(get_current_user), ): """幂等:相同 title+user_id 在 60s 内重复提交返回同一 ID""" return crud.post.create_with_owner(db, obj_in=post_in, owner_id=current_user.id) @router.patch("/{post_id}", response_model=schemas.PostRead) def update_post( *, db: Session = Depends(deps.get_db), post_id: int, obj_in: schemas.PostUpdate, current_user=Depends(get_current_user), ): post = crud.post.get(db, id=post_id) if not post or post.owner_id != current_user.id: raise HTTPException(404, "Not found or no permission") # 幂等:内容一致直接返回,不触发 UPDATE if post.title == obj_in.title and post.body == obj_in.body: return post return crud.post.update(db, db_obj=post, obj_in=obj_in)AI 自动给出:
- 依赖注入(
Depends) - 统一异常(
HTTPException) - 幂等判断(内容相同则不写库)
- 返回 DTO(
response_model)
人工只需补一句“软删除”逻辑,再让 AI 补is_deleted字段即可。
3. 前端组件:React + TypeScript
Prompt:
用 React+TypeScript 写一个文章卡片列表,支持响应式栅格、Skeleton 加载、无限滚动、点赞 optimistic update,代码需解耦 API 请求层。
AI 输出(核心片段):
// components/PostCard.tsx import { FC } from "react"; import { useLikePost } from "@/hooks/usePost"; export const PostCard: FC<{ post: PostItem }> = ({ post }) => { const { mutate, isLoading } = useLikePost(post.id); // React Query return ( <div className="card"> <h3>{post.title}</h3> <button disabled={isLoading} onClick={() => mutate({ postId: post.id })} > ❤ {post.likes} </button> </div> ); };useLikePost内部封装了optimistic update,AI 自动写好了onMutate/onError回滚逻辑,人工只需确认 key 值。
性能与安全:AI 写的代码也埋雷
AI 生成快,但“安全”不会自动生成,常见隐患与加固清单:
- SQL 注入:AI 偶尔偷懒写字符串拼接。强制使用 ORM 参数化查询;CI 里加
sqlfluff静态扫描。 - 过度依赖:Copilot 会把
requests.get()直接塞进视图函数,导致 I/O 阻塞。人工 review 时统一改httpx.AsyncClient。 - 冷启动延迟:Serverless 场景下,AI 喜欢一次性
import heavy;用lazy-load拆分,减少初始包体积。 - JWT 泄露:AI 默认把
SECRET_KEY写死成"change-me"。.env+python-dotenv读取,Git 预提交钩子检测硬编码密钥。 - 速率限制:AI 不会主动加
slowapi。在路由层统一加@limiter.limit("20/minute"),防止爆破。
一句话:把 AI 当“初级外包”,上线前必须走“人工 + 自动”双重安检。
生产环境避坑指南:从 push 到上线 30 分钟搞定
- Git 提交规范:用 Conventional Commits,
feat:/fix:/docs:前缀 + 简短说明,方便自动生成 CHANGELOG,回滚时一眼定位。 - 环境变量管理:线上配置全进平台环境变量,禁止写
config.py;本地用.env.example做模板,新人 5 分钟搭完。 - 简单 CI/CD:GitHub Actions 三件套——
lint→test→build→deploy。- lint:
ruff + mypy - test:
pytest --cov=app - build:
docker/build-push-action - deploy:SSH 到云主机
docker compose pull && up -d
- lint:
- 蓝绿/滚动:学生机只有 1C2G,用
docker compose --scale做滚动即可,出问题docker compose rollback秒级回退。 - 日志:AI 不写
structlog,人工加一行logger.bind(user_id=uid),后续检索可秒级定位。
结尾:让 AI 帮你“搬砖”,但别把脑子也搬出去
两周实战下来,最深刻的体会是:AI 把“写 if/else”变成了“说人话”,但把“说人话”翻译成“好需求”仍是人类功课。下一步,不妨挑一个自己项目里最恶心的模块——比如评论楼中楼、文件分片上传——按本文流程重构一遍:
- 先写行为级 Prompt,让 AI 出骨架;
- 补单元测试,逼自己理清输入输出;
- 上线上监控,看 CPU / 内存曲线是否真降。
等你把“AI 外包”调教到“AI 合伙人”,毕设就不再是“赶工”,而是一次真正的工程素养训练。祝你答辩顺利,代码里少些// TODO,明天再改。