1. 痛点:代码+报告,时间只有四周
大四下学期,白天实习、晚上论文,老师还催着“系统要演示、报告要胶装”。典型的一天是这样循环的:
- 上午调通支付接口,下午发现字段命名全乱,改到半夜;
- 凌晨两点对着空白 Word 写“5.1 系统架构”,结果只憋出三行字;
- 第二天早八答辩彩排,PPT 里还缺一张 ER 图。
编码和文档双重压力,本质上是“上下文切换”太频繁:刚进入代码区,又被格式、字号、引用文献拉回写作区,效率自然腰斩。
2. AI 工具怎么选?一张表看懂
| 场景 | GitHub Copilot | 通义灵码 | Claude 3.5 |
|---|---|---|---|
| 需求→用户故事 | 补全快、中文提示弱 | 中文需求理解好 | 长文本梳理清晰 |
| 数据库建模 | 靠注释猜字段 | ER 图一键生成 | 可输出 PlantUML |
| API 开发 | 实时补全,Clean Code 风格好 | 注释→代码同步 | 适合写复杂业务注释 |
| 报告生成 | 不适合长文 | 模板多,可直接出章节 | 逻辑段落最自然 |
我的组合打法:
- 用 Claude 先出“系统总体结构”文字稿;
- 把文字稿粘到通义灵码生成对应 ER 图、时序图;
- 编码阶段让 Copilot 补 JWT、订单状态机,省掉 40% 敲代码时间。
3. 最小可行购物网站(Spring Boot + Vue)
功能边界:注册登录、商品列表、下单、支付回调、后台改状态。只保留毕业设计必考的核心链路,方便写报告时“有图有真相”。
3.1 项目骨架
shopping-mini/ ├── back/ (Spring Boot 33.1) └── front/ (Vue3 + Vite)3.2 JWT 鉴权过滤器(back)
@Component @RequiredArgsConstructor public class JwtFilter extends OncePerRequestFilter { private final JwtUtil jwtUtil; private final UserService userService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = resolveToken(request); if (token != null && jwtUtil.validate(token)) { String username = jwtUtil.getUsername(token); UserDetails user = userService.loadUserByUsername(username); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken( user, null, user.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(request, response); } private String resolveToken(HttpServletRequest req) { String bearer = req.getHeader("Authorization"); if (bearer != null && bearer.startsWith("Bearer ")) { return bearer.substring(7); } return null; } }要点:
- 利用
OncePerRequestFilter保证一次请求只过滤一次; - 失败直接放行,后续接口用
@PreAuthorize兜底,逻辑更干净。
3.3 订单状态机(back)
public enum OrderState { PENDING_PAY, PAID, SHIPPED, COMPLETED, CANCELLED; public boolean canPay() { return this == PENDING_PAY; } public boolean canShip() { return this == PAID; } public boolean canComplete() { return this == SHIPPED; } public boolean canCancel() { return this == PENDING_PAY || this == PAID; } } @Service @RequiredArgsConstructor public class OrderService { private final OrderRepo repo; @Transactional public void pay(Long orderId) { Order o = repo.findById(orderId).orElseThrow(); if (!o.getState().canPay()) throw new BizException("非法支付"); o.setState(OrderState.PAID); } @Transactional public void ship(Long orderId) { Order o = repo.findById(orderId).orElseThrow(); if (!o.getState().canShip()) throw new BizException("非法发货"); o.setState(OrderState.SHIPPED); } }状态机把“能不能做”封装进枚举,Service 只看业务,不写if-else堆成山。
3.4 Vue 端调用示例(front)
// api/order.js import axios from '@/utils/request' export function payOrder(id) { return axios.post(`/order/${id}/pay`) } // views/Order.vue const handlePay = async () => { await payOrder(props.orderId) ElMessage.success('支付成功') emit('refresh') }4. 让 AI 帮你写报告,但别当甩手掌柜
步骤拆解:
- 把“需求段落”喂给 Claude,让它先生成 300 字中文概述;
- 将概述粘到通义灵码“论文助手”,选“系统设计”模板,自动生成 4 级标题:架构图、时序图、类图、数据库设计;
- 把生成的 PlantUML 粘到 PlantUML 在线 导出高清 PNG,插回 Word;
- 测试用例、安全性分析同理,先给 AI 关键词“输入合法性、越权、SQL 注入、XSS”,让它按学校格式列 1.2.3.,再人工补真实数据。
这样,报告 80% 框架 AI 搞定,留下 20% 人工润色,既保证学术规范,也避免“查重”飘红。
5. 性能与安全:AI 写的代码也要过安检
- SQL 注入:让 AI 用 JPA / MyBatis-Plus 的
Example或@Query写法,禁止拼接字符串; - XSS:Vue 默认转义,后台富文本用 Jsoup 白名单过滤;
- 状态机幂等:在
OrderState加锁版本号,AI 容易忽略,需要手动补上; - 性能:AI 常给出 N+1 查询,打开
spring.jpa.properties.hibernate.show_sql=true,看到多余语句就加@EntityGraph; - 敏感操作日志:AI 不记得写“谁点了发货”,在
OrderService.ship()里手动加@Log("订单发货")。
一句话:AI 是高速打字机,安全与性能仍是程序员的责任。
6. 避坑指南
- 人工 Review 不可省:AI 会把别人的 GitHub 代码原样拼过来,查重系统一眼识破;
- 逻辑一致性检查:AI 可能前端给你
axios.put,后端却生成@PostMapping,跑不通还找不到原因; - 引用文献自己找:AI 会“编”出一篇看起来正规的论文,其实 DOI 不存在;
- 别让 AI 决定架构:它爱用“微服务”这个词,毕业设计真拆成 5 个服务,服务器跑不动,老师也不会给你高分;
- 每完成一个模块,git commit 写清楚“AI 生成 / 人工修改”,方便回滚,也体现过程分。
7. 交付演示:把 AI 当 Pair,而不是枪手
答辩时老师最爱问:“这段订单状态为什么要加版本号?”
如果你一句“AI 写的”甩锅,现场气氛直接零下。
正确姿势是:先让 AI 给出方案,自己再查《Java 并发实践》补理论,最后把“乐观锁防止并发修改”写在报告里——既展示工程能力,也体现你理解原理。
8. 思考题:AI 生成的毕业设计,如何体现个人工程能力?
- 重构一个 AI 生成的模块,比如把“一口价”改成“阶梯优惠”,用策略模式替换
if-else; - 在报告里加“迭代记录”附录,放三张截图:AI 初版 → 你的重构 → 单元测试通过;
- 性能压测:把 AI 写的联表查询从 1200 ms 压到 180 ms,写清加索引、改 SQL、缓存三步曲。
动手改一行代码,比让 AI 写十页报告更能证明你是合格工程师。
祝各位毕业顺利,把 AI 当加速器,别当驾驶座。代码跑通、报告胶装那一刻,你会感谢那个“又写又改”的自己。