一句话说清这个项目:学生拍照上传作业 → AI 自动批改 → 错题自动归档 → 家长/老师看统计,全程后端零服务器、零成本,全部跑在微信小程序云开发上。
核心痛点很直接:老师批改作业太费时,学生订正后错题又容易散落各处、无法追溯。
我希望用一个小程序把这些环节串起来:
选微信小程序云开发的原因只有两个:不用买服务器、不用配域名和 HTTPS,写完直接部署上线。
整个项目由 4 个云函数 + 4 个数据库集合构成,职责划分如下:
云函数 | 职责 |
|---|---|
login | 静默登录,拿 openid,初始化用户 |
gradeAI | 核心:接收作业图片,调用 AI 批改,返回分数与逐题结果 |
notify | 批改完成后给用户推订阅消息 |
stats | 聚合提交数、平均分、错题分布,返回给前端图表 |
数据库集合 | 存什么 |
|---|---|
users | 用户资料(openid、昵称、角色:学生/老师/家长) |
assignments | 作业任务(题目、截止时间、发布人) |
submissions | 提交记录(图片、AI 批改结果、分数) |
mistakes | 错题本(按用户 + 知识点归档) |
数据流一句话概括:
这套结构的好处是职责单一:每个云函数只干一件事,改起来互不影响,也方便单独调超时和权限。
以 submissions(提交记录)为例,字段设计如下:
mistakes(错题本)的关键设计是冗余存储知识点标签,方便后面 stats 直接按标签聚合:
设计原则:读多写少的场景下,宁可冗余字段,也不要频繁跨集合 join。 小程序端查错题本一次
get就够了。
login —— 静默登录gradeAI —— 核心批改(重点)这里是整个项目最容易踩坑的地方,先说结论:AI 调用一定要放到云函数里做,且要处理超时。
notify —— 订阅消息批改完成后推一条「批改已完成」的订阅消息,核心是提前让用户授权,否则 subscribeMessage.send 会静默失败。
stats —— 数据统计这一节是我全程最值钱的部分——下面 6 个坑,每一个都踩过、都耗了我至少半小时。
现象:开发者工具里右键云函数「上传并部署」成功后,本地运行还是报 function not found。
原因:project.config.json 里 cloudfunctionRoot 没指向正确的函数目录,或者上传的是别的目录。
解决:
确认函数目录名和「云开发控制台」里显示的名字完全一致。
现象:学生 A 提交后,老师端查不到数据。
原因:集合默认权限是「仅创建者可读写」,跨用户读取直接返回空。
解决:在云开发控制台 → 数据库 → 对应集合 → 权限设置,改成自定义安全规则,例如提交记录允许同一条记录被指定角色读取:
现象:批改图片稍微大一点就报错,前端一直转圈。
原因:云函数默认超时时间只有 3 秒,AI 批改通常要 5~15 秒。
解决:在云开发控制台把 gradeAI 函数的超时时间调到 20 秒(可在 config.json 里配 "timeout": 20)。
现象:代码明明对,数据却总写到另一个环境去了。
原因:开发环境 / 生产环境 ID 混淆,wx.cloud.init({ env: 'xxx' }) 传了错的 env。
解决:云函数里统一用 cloud.DYNAMIC_CURRENT_ENV(当前环境),小程序端用 wx.cloud.init({ env: '真实环境ID' }),并在 .env 或常量里集中管理,别散落硬编码。
现象:手机原图 3~5 MB,上传慢、AI 识别也慢。
解决:上传前用 wx.compressImage 压缩到 1 MB 以内,再 wx.cloud.uploadFile。质量和速度兼得。
现象:代码没报错,但用户就是收不到通知。
原因:subscribeMessage.send 前用户没有授权订阅,或者模板字段类型对不上。
解决:提交流程里先 wx.requestSubscribeMessage 让用户点同意;模板字段类型要严格按模板(thing / number / date 等)填,不能混。
这个小程序从想法到上线,全程我一个人完成,后端零服务器成本,只靠微信云开发就撑起了完整闭环:
如果你也在做类似的小工具,强烈建议从「先跑通一个最小闭环(上传 → 批改 → 入库)」开始,再逐步加通知和统计,能少走很多弯路。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。