单人毕设的三座大山:CRUD、权限、部署
做毕业设计最怕什么?不是选题,不是答辩,而是“一个人扛下所有”。去年我带学弟做校园二手交易平台,两周就被这三件事劝退:
- CRUD 写到吐:商品、订单、用户、评论……每张表都要写 7 套接口,复制粘贴 3 次就眼花。
- 权限一团麻:学生、管理员、游客三种角色,拦截器、注解、配置类东拼西凑,越改越乱。
- 部署火葬场:本地跑得好好的,上到云服务器就 404,日志里全是 “datasource connection timeout”。
那时候我们最大的愿望就是“有人帮我先把 70% 的脏活累活干掉”,于是把希望投向了 AI。
AI 助手横评:谁更适合 Spring Boot?
我实测了 3 款主流插件,同样一句需求:“帮我写一段 Spring Boot 接口,分页查询商品,按发布时间倒序,返回 VO。” 结果如下:
| 工具 | 生成速度 | 代码完整度 | 对 Spring 注解理解 | 中文注释 | 免费额度 |
|---|---|---|---|---|---|
| GitHub Copilot | 2 秒 | 80%,缺 VO 类 | 熟,但默认用 Lombok | 英文为主 | 每月 2000 次 |
| CodeWhisperer | 3 秒 | 75%,缺分页 | 一般,常混用 JPA 与 MyBatis | 中英夹杂 | 永久免费 |
| 通义灵码(IDEA 插件) | 2 秒 | 95%,直接给 VO、PageHelper | 精准,自动加 Swagger 注解 | 纯中文 | 登录送 100 次/天 |
结论:
- 想要“一口气写完三层代码”→ 通义灵码最省事;
- 已经习惯 JetBrains 系英文提示 → Copilot 更顺滑;
- 纯白嫖 + 轻量 → CodeWhisperer 能跑就行。
实战:用 Prompt 让 AI 一次性生成 Clean Code
下面以“校园二手交易平台-发布商品”为例,演示如何把一句话需求拆成 AI 能听懂的“指令模板”。
1. 需求拆解
先画一张极简流程图:
用户 → POST /items → Controller → Service → DAO → DB
返回:统一响应 R
2. 精准 Prompt 模板
把下面 5 要素喂给 AI:
- 背景:Spring Boot 2.7 + MyBatis-Plus + MySQL 8
- 分层:Controller / Service / Mapper / Entity / VO
- 规则:RESTful、统一返回 R 类、字段下划线转驼峰、Swagger 注释
- 安全:参数校验 + 全局异常拦截
- 示例:入参 CreateItemDTO,出参 ItemVO,分页用 MyBatis-Plus Page
复制到通义灵码对话框,回车,10 秒拿到完整代码:
- Controller
@RestController @RequestMapping("/api/items") @Tag(name = "商品接口") public class ItemController { @PostMapping public R<ItemVO> create(@Valid @RequestBody CreateItemDTO dto){ return R.success(itemService.create(dto)); } }- Service
@Service @RequiredArgsConstructor public class ItemService { private final ItemMapper itemMapper; @Transactional public ItemVO create(CreateItemDTO dto){ Item item = BeanUtil.copy(dto, Item.class); item.setGmtCreate(LocalDateTime.now()); itemMapper.insert(item); return BeanUtil.copy(item, ItemVO.class); } }- Mapper XML 也一并生成,连
<resultMap>都写好了。 - 统一返回类 R、全局异常、Validation 注解全配齐,直接能跑。
3. Prompt 小技巧
- 先给“上下文”:把项目已有的 R 类、PageDTO 贴到对话框,AI 会按你的风格续写。
- 再圈“范围”:用
// TODO AI:生成以下方法注释,插件只会补全注释下方,避免整屏乱改。 - 后加“约束”:末尾追加 “不要 Lombok”、“MyBatis-Plus 写法”,可显著减少返工。
AI 代码的暗礁:安全、事务、性能
AI 写得快,但“坑”也快。以下 3 类问题必须人工复审:
安全漏洞
- SQL 拼接:AI 偶尔偷懒写
${}而不是#{},一跑就注入。 - 越权:生成的接口默认不带用户 ID 校验,需要手动加
ThreadLocal<User>拦截。
- SQL 拼接:AI 偶尔偷懒写
事务缺失
- 批量插入时,AI 常忘
@Transactional,失败就脏数据。 - 嵌套事务:默认
REQUIRED可能不满足,需要改成REQUIRES_NEW并测试回滚。
- 批量插入时,AI 常忘
性能陷阱
- N+1 查询:AI 给的 Mapper 只查主表,字段里出现
userName就触发二次查询。 - 大字段:把
text类型description也SELECT *,带宽瞬间爆炸。
- N+1 查询:AI 给的 Mapper 只查主表,字段里出现
建议做法:
- 生成后立刻跑单元测试,用
p6spy打印 SQL,看语句条数。 - 打开 IDEA “Database” 面板,执行计划
EXPLAIN每句慢 SQL。 - 引入
CheckStyle插件,强制扫描${}与@Transactional覆盖率。
生产级避坑指南:连接池、JWT、文档
1. 数据库连接池
AI 默认给的application.yml只有
spring: datasource: url: jdbc:mysql://localhost:3306/secondhand username: root password: 123456上线必炸。手工补全 Hikari:
hikari: maximum-pool-size: 20 minimum-idle: 5 idle-timeout: 300000 connection-test-query: SELECT 12. JWT 令牌刷新
AI 只会生成“登录返回 token”,不管续签。加上“双 Token” 机制:
- 登录返回
accessToken(15min)+refreshToken(7d) - 拦截器发现
accessToken过期但refreshToken有效,直接颁发新accessToken - 用 Redis 记录刷新标识,防止并发刷新重复写库。
3. Swagger 一键文档
通义灵码已自动加@Operation,再配:
springdoc: swagger-ui: path: /doc.html tags-sorter: alpha启动后访问http://ip:8080/doc.html,接口分组清晰,毕业答辩现场演示给老师,直接加分。
把项目跑起来:30 分钟部署脚本
写个deploy.sh一键完成:
mvn -DskipTests packagescp target/secondhand.jar user@云主机:/opt/- ssh 远程
systemctl restart secondhand - 健康检查
curl -f http://localhost:8080/actuator/health
脚本放仓库,AI 也能帮你迭代,每次改完 push 后打git tag v1.x,回滚无忧。
写在最后:AI 不会替你思考,但能让你飞
两周下来,我们把原计划 6 周的工期压到 2 周,代码行数少了 40%,Bug 率降了 60%。最深的体会是:AI 是“超级助理”,不是“替身”。
它擅长套路,你把“业务含义、边界、异常”讲清楚,它就能瞬间产出骨架;但架构权衡、安全兜底、性能红线,依旧要靠人脑决策。
毕业设计只是起点。接下来不妨把 AI 生成的代码再重构一遍——
- 把重复 DTO 抽象成泛型;
- 把 if-else 策略化;
- 把日志链路接入 ELK。
在一次次“让 AI 先跑”与“把人脑补位”的循环里,你会慢慢长出新时代开发者最稀缺的核心竞争力:问题拆解与质量把控。
打开 IDE,复制一段烂代码,试着写一段精准 Prompt,再亲手把生成的漏洞补上——这就是下一封简历里最能打的故事。