毕业设计常见痛点:为什么“化妆品商城”总被导师打回
做电商类毕设,十个同学九个九个被问到“你跟别人有什么区别”。表面看是创新度,根子却在工程规范:功能拍脑袋想、数据库一张大宽表、前端把业务逻辑全写在mounted()里。去年我指导的学妹,商品 SKU 用字符串拼接当主键,结果答辩现场演示时多刷一次页面,库存直接变负数,场面一度尴尬。
痛点归纳起来三条:
- 需求膨胀:想着“加个秒杀”“再做个优惠券”,写到第三章发现章节之间对不上。
- 架构随意:controller 里写 SQL、Vue 页面直接
axios.get('/api')写死地址,后期联调一小时,改地址五分钟。 - 测试缺失:Postman 点两下就算通过,老师一压测 500 错误全暴露。
带着这三颗雷,我用 AI 辅助重做了一套“化妆品商城”,两周时间代码量 4k→1.8k,缺陷全部单元测试覆盖,答辩时导师直接给了优秀。下面把完整过程拆给你看。
AI 工具选型:Copilot、CodeWhisperer、通义灵码谁更适合学生机
先给结论:学生党电脑 8G 内存 + 校园网,优先顺序通义灵码 > Copilot > CodeWhisperer。
| 维度 | 通义灵码(阿里) | Git Copilot | CodeWhisperer |
|---|---|---|---|
| 中文提示 | 原生支持 | 需英文 | 需英文 |
| 离线补全 | 可 | 可 | 需 AWS 账号 |
| 收费 | 教育邮箱免费 | 10$/月 | 免费但需国际信用卡 |
| 代码溯源 | 可查许可证 | 无 | 有 |
| 毕设场景 | 中文注释秒生成接口 | Vue 模板补全快 | 安全扫描好用 |
实际组合:通义灵码负责“能跑起来”,Copilot 负责“优雅重构”,CodeWhisperer 只在最后做安全审计。下文示例以通义灵码为主,其他工具同理。
核心模块 AI 协同实战
1. 商品展示:让 AI 一次性生成 VO、DTO、Converter
需求描述直接写中文注释:
// 根据品牌名模糊查询上架商品,按价格升序,返回给前端的字段去掉库存数通义灵码会给出三段代码:
ProductQueryDTO含brandKeyword/sort字段ProductListVO去掉stock并增加thumbnailProductConverter用 MapStruct 自动映射
人工只需检查字段名是否对得上数据库,整个过程 3 分钟。以前手写要 20 行样板代码,现在一行都不用自己敲。
2. 购物车:AI 帮你把“幂等”写进注释
购物车最常见问题:用户狂点“+”号,接口被刷出多条记录。告诉 AI:
// 幂等新增:同一用户同一 SKU 只增数量,不置灰按钮生成的 Service 层直接用userId + skuId做唯一索引,并在注释里写明INSERT ... ON DUPLICATE KEY UPDATE quantity=quantity+#{delta}。前端 Vue 组件也同步生成:
// 防抖 500 ms,防止用户连击 const debounceAdd = debounce(addCartAPI, 500)AI 把“幂等”+“防抖”一次搞定,后期压力测试 200 并发 0 脏数据。
3. 订单管理:状态机 + 策略模式,AI 比你更懂 Clean Code
订单状态流转是导师最爱问的点。直接注释:
// 待支付 -> 已支付 -> 已发货 -> 已完成,使用策略模式校验每个扭转AI 会生成:
OrderStatusEnumOrderStatusFlowStrategy接口- 四个策略实现类
- 一个
OrderStatusContext做调度
人工只需补充数据库持久化一行代码,策略模式天然符合开闭原则,答辩讲到扩展“取消订单”时,直接新增一个策略类即可,导师听完直接点头。
Clean Code 片段:前后端各一段可直接抄
后端:RESTful 幂等更新库存
/** * 更新库存(幂等) * 利用乐观锁 version 字段,防止并发超卖 */ @PutMapping("/stock") public R<Void> updateStock(@RequestBody @Valid StockUpdateDTO dto) { int affected = productMapper.updateStock( dto.getProductId(), dto.getQuantity(), dto.getVersion()); // SQL 里 WHERE version=#{version} if (affected == 0) { throw new OptimisticLockException("库存并发更新冲突,请重试"); } return R.ok(); }前端:Vue3 组合式解耦购物车列表
<script setup> // 只关心列表渲染,业务逻辑全部收敛到 useCart import { useCart } from '@/composables/useCart' const { cartItems, removeItem, updateQty } = useCart() </script> <template> <CartList :items="cartItems" @remove="removeItem" @update="updateQty" /> </template>把“取数/改数/删数”全放useCart.js,组件只当“纯展示”,后期做小程序商城移植,几乎 0 改动。
性能与安全:学生项目最容易翻车的两点
1. 性能
- 商品列表走分页 + 覆盖索引(brand, status, price),10 万数据 15 ms 内返回。
- 购物车缓存用Redis hash,key 设计
cart:{userId},field 为skuId,避免大 key 热。 - 图片素材统一走 OSS + CDN,缩略图后缀
@100w,减少 90% 流量。
2. 安全
- SQL 注入:MyBatis 全部
#{}占位,AI 会提示“此处请使用#而非$”。 - JWT 刷新:AccessToken 5 min + RefreshToken 7 day,刷新接口返回新令牌并写入响应头
X-New-Token,前端 Axios 拦截器自动替换,用户体验无感知。 - 越权:订单详情接口带
userId = SecurityContextHolder.getUserId(),AI 自动在 SQL 追加AND user_id = #{userId},防止横向越权。
生产环境避坑指南
- CORS:Spring Boot 3 默认不再允许
*通配,本地调试把allowed-origin-patterns写成http://localhost:*,否则前端 200 也进不了 then。 - 数据库冷启动:阿里云学生机 1C2G,MySQL 8 首次查询 3 s,把
spring.datasource.hikari.minimum-idle调成 3,启动时预热连接池,降到 500 ms。 - 图片 404:OSS 绑定自定义域名一定先备案,再配 CNAME,否则答辩现场 HTTPS 会报红叉,导师印象分直接打折。
- 日志别忘关 Debug:学生机磁盘 40 G,一天刷 5 万行日志,三天撑爆,生产选
INFO并在logback-spring.xml里加maxHistory=3。
写在最后:让 AI 写代码,但别让 AI 替你思考
AI 辅助最大的价值是“把样板时间压缩到 0”,让你把精力花在真正的业务洞见——比如化妆品商城能不能做“肤质问卷 + 智能推荐”?这些才是导师想听的创新点。工具再强,也替代不了你定义问题、验证市场、讲述故事的能力。
如果你已经有一套祖传代码,不妨用上面的流程重构一遍:让通义灵码帮你重新生成 VO,让 Copilot 帮你把大方法拆成策略,让 CodeWhisperer 跑一遍安全扫描。两周后你会发现,毕设不再是一堆“能跑就行”的脚本,而是可以写在简历里的工程作品。祝你答辩顺利,也祝你在人机协作的边界上,找到属于自己的创新切口。