AI 辅助下的商城开发毕业设计:从需求建模到代码生成的全流程实战
毕业设计只剩 8 周,导师一句“功能要完整、代码要优雅、答辩要能打”,直接把难度拉满。
去年我还在手写 SQL、通宵调接口,今年直接让 AI 打主力,三周跑完一个可上线的商城,把省下来的时间刷剧不香吗?
这篇笔记把全过程拆给你看,能抄就抄,不能抄至少知道坑在哪。
一、传统手工模式:那些年踩过的坑
先吐槽一下纯手工开发,不然体会不到 AI 有多香。
- CRUD 写到吐:商品、SKU、库存、优惠券……每张表至少 5 个接口,增删改查+分页,复制粘贴 300 行起步,写完就忘。
- 联调地狱:前端 Vue 调 Mock,后端 Postman 调通,结果一合体字段对不上,通宵改 DTO 是常态。
- 需求反复:导师一句“加个秒杀”,表结构、库存逻辑、并发锁全得返工,代码冲突 merge 到哭。
- 测试覆盖随缘:工期紧,单元测试被砍,上线前心慌 500,日志里全是 NullPointer。
图:纯手工阶段时间分布,编码只占 30%,联调和返工才是大头。
二、AI 工具选型:谁才是电商 MVP?
我把主流插件都装了一遍,结论先给:
| 工具 | 场景契合度 | 中文语义 | 离线可用 | 备注 |
|---|---|---|---|---|
| GitHub Copilot | ★★★★☆ | 一般 | 否 | 单行补飞快,上下文短 |
| 通义灵码 | ★★★★★ | 优秀 | 可 | 阿里系,电商例子多 |
| Cursor | ★★★★☆ | 良好 | 否 | 自带对话窗口,改文件方便 |
| CodeSnap + 自训模型 | ★★☆☆☆ | 自定义 | 可 | 成本高,毕业设计没必要 |
最终方案:
- 后端 Java:IntelliJ + 通义灵码(阿里 Java 规范喂得多,生成 Service 层很稳)。
- 前端 TypeScript:VS Code + Copilot(React/Vue 模板熟,写页面嗖嗖的)。
- 需求拆解/评审:Cursor Chat 当“伪产品经理”,先让它给用例图,再细化到 API。
三、AI 驱动开发流程:从 PRD 到 PR 的 5 个阶段
需求建模:
把“我要做一个商城”这句话丢给 Cursor,让它输出一份 PRD(产品需求文档)大纲,再人工补细节。
提示词模板:你是一名电商产品经理,请输出一份 B2C 商城的 PRD,包含用户故事、核心业务流程、风险列表。要求采用 Markdown 表格。30 秒拿到骨架,自己再填业务规则,极大降低“面对空白 Word”的恐惧。
表结构 & 接口设计:
把 PRD 贴给通义灵码,让它按阿里规范生成 MySQL 建表语句、Spring Doc 注解的 Swagger 接口。
注意:一定加约束——“字段必须带注释、时间戳统一用 datetime(3)、禁止外键”,否则它会自由发挥。代码生成:
采用“Controller → Service → Mapper”三层递进提示,每层让 AI 先生骨架,再人工 review。
示例提示:用 Spring Boot 3 写一段新增商品的 REST 接口,要求: - 参数校验用 @Valid + 自定义注解 - 返回统一 Result<T> - 捕获全局异常 - 符合 Clean Code,每行不超过 80 字符生成后只改业务,不改风格,review 速度翻倍。
单测 & 联调:
让 Copilot 对着方法名自动生成 JUnit5 + Mockito 用例,覆盖 80% 分支即可。
前端同理,生成 MSW(Mock Service Worker)假数据,后端 Ready 后一键切真实接口。安全 & 性能:
AI 也会“健忘”,必须二次加固。- 用 Cursor 问:“这段 SQL 是否可能存在注入?” 它会指出 #{ } 占位问题。
- 再用 GitHub CodeQL 跑一遍,零容忍。
- 压测:JMeter 脚本让 AI 写,200 并发 10 min,90% RT < 300 ms 才达标。
四、核心模块 AI 实战拆解
1. 购物车并发控制
场景:同一 SKU 被 1k 用户同时加购,超卖就是事故。
AI 步骤:
- 让灵码生成基于 Redis + Lua 的库存预扣脚本,保证原子性。
- 提示词加“compare-and-set”关键词,它会自动用
redis.call('GET',KEYS[1])做库存对比。 - 人工 review:Lua 脚本不超过 4 个参数,避免 KEYS 数组越界。
关键代码(Java 片段):
// CartService.java public void addItem(Long skuId, int num) { // 1. 用户维度限流,防刷 String lockKey = "cart:lock:" + UserContext.getUserId(); Boolean ok = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", Duration.ofSeconds(3)); if (Boolean.FALSE.equals(ok)) { throw new BizException("操作太频繁,请稍后再试"); } try { // 2. 库存预扣 Lua 脚本 String script = "local stock = tonumber(redis.call('get', KEYS[1])) " + "if stock >= tonumber(ARGV[1]) then " + " redis.call('decrby', KEYS[1], ARGV[1]) " + " return 1 " + "else " + " return 0 " + "end"; Long result = redisTemplate.execute( new DefaultRedisScript<>(script, Long.class), List.of("stock:" + skuId), num); if (!Long.valueOf(1L).equals(result)) { throw new BizException("库存不足"); } // 3. 写购物车 DB(异步消息表,最终一致) cartMapper.insertSelective(buildItem(skuId, num)); } finally { redisTemplate.delete(lockKey); } }Clean Code 要点:
- 魔法值 1/0 用常量表达含义;
- 提前 return,减少嵌套;
- 加注释写明“预扣非实扣”,方便后人。
2. 订单状态机
场景:订单有 5 大状态(待支付、已支付、已发货、已完成、已关闭),事件驱动。
AI 做法:
- 让 Cursor 生成 Spring StateMachine 配置,状态、事件、动作一揽子。
- 提示词强调“持久化到 DB”,它会自动加
JpaPersistingRepository。 - 人工补“关单”定时任务,用
@Scheduled每 10min 扫描过期订单。
TypeScript 前端联动:
// orderStatus.tsx const statusMap: Record<OrderStatus, string> = { PENDING_PAY: '待支付', PAID: '已支付', ... }; export const TagColor = (s: OrderStatus) => { switch (s) { case 'PENDING_PAY': return 'orange'; case 'PAID': return 'blue'; default: return 'default'; } };AI 先枚举,再人工调色,保证 UI 语义一致。
五、安全加固 & 性能压测
- SQL 注入:
MyBatis-Plus 默认#{}安全,但 Copilot 偶尔手写${},一律拦截。 - JWT 校验:
让 AI 生成过滤器,必须加“刷新令牌双 Token”逻辑,防止单点失效。 - 压测结果:
- 4C8G 容器,200 并发下单,CPU 65%,TP99 480 ms;
- 开 Redis 缓存后 QPS 提升 2.3 倍,DB 连接降到 12 个。
六、生产环境避坑指南
- 事务回滚失效:
捕获异常后别私自吞掉,AI 生成的try-catch有时只打印日志,一定加throw new RuntimeException(e)触发回滚。 - 缓存穿透:
布隆过滤器 AI 不会主动写,提示词里加“防止恶意查询空商品”,它才会生成BloomFilterHelper。 - 幂等性:
订单接口 AI 喜欢“无脑插入”,记得在唯一索引字段上加UK_ORDER_SN,提示词里强调“幂等 token”。 - 日志脱敏:
AI 打印对象默认 toString,可能含手机号,统一用@JsonIgnore或 Logback 脱敏插件。 - 版本漂移:
生成代码依赖最新包,但服务器 JDK17 你本地 21,记得锁定<java.version>。
七、落地时间线复盘
| 周次 | 任务 | 人工时 | AI 辅助点 |
|---|---|---|---|
| 1 | 需求+PRD | 8h | Cursor 生成大纲 |
| 2 | 表结构+接口 | 10h | 灵码生成 SQL、Swagger |
| 3 | 核心代码 | 16h | 三层骨架、单元测试 |
| 4 | 联调+前端 | 12h | Copilot 写页面、MSW |
| 5 | 安全+压测 | 6h | CodeQLL、JMeter 脚本 |
| 6 | 导师评审返工 | 4h | 人工 |
| 7 | 文档+PPT | 6h | AI 画图、生成摘要 |
| 8 | 答辩彩排 | 2h | 人工 |
总编码时长约 64h,比纯手工组(预估 180h)节省 65%,而且单测覆盖率 82%,导师没挑出大毛病。
八、结尾:轮到你了
AI 不是“代写”,而是超级外脑。
把这篇流程套到你的毕业设计里,先跑通一个模块,比如“优惠券”或“收货地址”,再对比旧代码的 bug 数和行数,你会直观看到差异。
下一步,找个遗留的if-else地狱,用提示词让它重构为策略模式,跑一遍测试,记得把结果发我——看看谁的 AI 更乖。