背景痛点:一个人做毕设,到底卡在哪?
做毕业设计最怕“三缺”:缺产品图、缺接口人、缺运维。
订餐小程序听起来简单,真动手才发现:
“下单”两个字背后藏着登录、菜品、库存、支付、状态机、消息通知……
老师要求“创新点”,自己却连分页都调不通;
前端写死字段,后端一改就炸;
本地跑得好好的,一上线就 502;
最惨的是,微信审核同学一句“用户隐私描述不完整”,打回重改三天。
去年我帮室友调他的“校园点餐”代码,凌晨两点还在 console.log 里找 null。
那一刻深刻体会:毕设最大的技术债,是“时间债”。
于是今年轮到自己,干脆把 AI 当“外挂”,从需求到部署全程辅助,结果 15 天交稿,老师看完只提了两条优化建议。
下面把完整路径拆开,给同样赶进度的你一份“可抄作业”。
技术选型:别让框架把自己绕进去
1. 前端:Taro vs 原生小程序
- 原生小程序:IDE 稳定、组件丰富,但语法老旧,复用性差,一旦要出 H5 或 RN 版本得重写。
- Taro(React 语法):一份代码可转微信小程序、H5、甚至 RN。AI 提示词对 JSX 更友好,Copilot 补准确率明显高。
结论:毕设只跑微信?原生够用。想“一鱼多吃”投简历,直接 Taro。
2. 后端:云开发 vs 自建 Node
- 云开发(微信·云托管):免域名、免备案、自动 HTTPS,毕业即弃成本最低。
- 自建 Node + VPS:可写任意逻辑,但证书、进程守护、日志、灰度全是坑。
结论:时间 < 30 天,选云开发;想炫技给面试官看 Docker,再自建。
3. 数据库:MongoDB vs MySQL
- Mongo:云开发原生支持,文档型,改字段不锁表,AI 生成的嵌套 JSON 直接塞。
- MySQL:关系型,订单明细、库存扣减需要事务,AI 补的 SQL 容易漏掉索引。
结论:毕设场景简单、事务要求不高,Mongo 省掉建表、联表、迁移烦恼;若老师强制 ACID,再上 MySQL。
AI 辅助开发流程:从“一句话需求”到可运行代码
1. 需求建模:让 AI 先写 PRD
把“我要一个订餐小程序”丢给通义灵码,提示词加三行约束:
- 角色:产品助理
- 输出:Markdown 用户故事 + 数据库草图
- 范围:仅包含用户端、商家端、管理员端核心功能
30 秒后拿到 8 条用户故事,附带字段说明。
复制到 README,老师一看:需求章节完整,直接过审。
2. 数据库设计:AI 生成 + 人工复核
把 PRD 里的实体喂给 ChatGPT:
“根据下方用户故事,生成 MongoDB 集合文档示例,要求支持库存原子扣减。”
AI 返回:
- menu 集合:_id、name、price、stock、lock(乐观锁字段)
- order 集合:_id、uid、items、state(enum)、payId、createTime、updateTime、version
再给云函数加上“version + 1”条件更新,就能防并发竞争。
索引让 AI 顺手写:
db.order.createIndex({ uid:1, createTime:-1 })云开发控制台一键粘贴,完事。
3. 前端骨架:Taro + TypeScript,Copilot 负责搬砖
新建页面时先写注释:
/** * 菜品列表页 * 1. 支持分页加载 * 2. 库存为 0 自动置灰 * 3. 点击跳转详情 */Copilot 会依次补全 useState、useEffect、map 渲染、样式。
遇到微信 API,把“Taro 调用微信支付”贴一行,它自动补出 requestPayment 模板。
10 分钟一个页面,比自己手敲快 5 倍。
4. 后端云函数:入口模板 + 业务逻辑分离
AI 先生成“万能入口”:
// cloudfunc/src/index.ts import { cloud } from '@wx/cloud' exports.main = async (event, context) => { const { func, data } = event // func 对应业务名 const handler = await import(`./funcs/${func}`) return handler.default(data, cloud) }再让 AI 写“创建订单”逻辑,要求:
- 幂等:同一 payId 重复请求返回原订单号
- 防超卖:stock 减操作使用 mongo findOneAndUpdate 条件 version
- 事务:使用 mongo session,multi-doc 事务回滚
生成的核心代码如下(已加注释):
// cloudfunc/src/funcs/createOrder.ts import { ObjectId } from 'mongodb' export default async (data: any, cloud: any) => { const { uid, items, payId } = data const db = cloud.database() const orderColl = db.collection('order') const menuColl = db.collection('menu') // 1. 幂等:payId 是否已存在 const exist = await orderColl.findOne({ payId }) if (exist) return { ok: 0, orderId: exist._id } const session = db.client.startSession() try { await session.withTransaction(async () => { // 2. 预检查库存 & 锁库存 for (const it of items) { const res = await menuColl.findOneAndUpdate( { _id: new ObjectId(it._id), stock: { $gte: it.count }, lock: 0 }, { $inc: { stock: -it.count }, $set: { lock: 1 } }, { session, returnDocument: 'after' } ) if (!res.value) throw new Error('库存不足') } // 3. 写订单 const now = new Date() const version = 1 const order = { uid, items, state: 'UNPAID', payId, createTime: now, updateTime: now, version } const r = await orderColl.insertOne(order, { session }) return { ok: 1, orderId: r.insertedId } }) } finally { await session.endSession() } }AI 写完,人工只改两处:
- 把 lock 字段改为 version 自增,更符合乐观锁语义;
- 返回字段统一用 snake_case,与前端一致。
5. 支付模拟:不走真实微信,演示也能“到账”
毕设演示不一定真收钱,可用“模拟支付”云函数:
- 前端调用 payMock,参数只传 orderId
- 云函数 sleep 1 秒后把订单 state 改为 PAID,并推送微信订阅消息
Copilot 生成的 sleep 用 setTimeout 包 Promise,顺带把模板消息 ID 写好,复制到云开发控制台即可。
性能与安全:让代码既能跑又不裸奔
1. 冷启动优化
- 云函数入口统一,依赖提前 require,减少动态 import
- 把 mongo 连接放全局变量,利用云开发实例复用
- 编译时开“合并打包”,Taro 把页面拆包阈值调到 20KB,首屏只加载必要 js
2. 敏感信息脱敏
- 返回订单列表时,手机号中间四位打星号,让 AI 写正则
/(\d{3})\d{4}(\d{4})/ - 日志禁止打印 openid、union key,使用 cloud.logger 的采样级别
3. 接口限流
云开发环境自带 QPS 500,但毕设答辩时同学一起点,仍会 429。
在入口加计数器:
const limiter = new Map<string, number>() export const freqGuard = (uid: string, max = 20) => { const n = limiter.get(uid) || 0 if (n >= max) throw new Error('请求过于频繁') limiter.set(uid, n + 1) setTimeout(() => limiter.delete(uid), 60_000) }AI 30 秒写完,手动把 Map 换成 Redis 即可复用到生产。
生产环境避坑清单
1. 微信审核
- 用户隐私说明必须出现“订单处理、配送联系”字样,AI 生成后复制到 settings.json
- 小程序类目选“餐饮 - 外卖”,别选“工具”,否则要食品许可证
2. 本地调试 vs 线上
- 云开发本地 emulate 对 node 16 支持最好,14 会提示 uuid 错误
- 真机调试一定开“不校验域名”,否则 localhost 请求被拦截
3. AI 代码验证方法
- 让 AI 先生成单测,再跑 jest --coverage,低于 80% 打回重写
- 对并发逻辑用 autocannon 压 50 线程,观察库存是否为负
- 把 mongo 日志开至 query 级别,确认索引是否命中
结尾:把 AI 当搭档,而不是当枪手
整套流程跑下来,最大的感受是:AI 把“重复体力活”变成了“一分钟工程”,但架构思维、边界条件、验收标准依旧要靠自己。
建议你现在就打开编辑器,挑一个 AI 刚帮你生成的模块——比如订单状态机——亲手给它补单元测试,把 if-else 改成表驱动策略,再跑一次压测。
你会立刻发现:可测试性、可维护性、可扩展性,才是毕业设计真正的得分点。
动手重构吧,祝你 15 天后也能轻松答辩,顺利收官。