去年秋天,一位在石家庄做职业培训的朋友找到我,说他们机构每年有上千名学员要刷题备考,现在还在用纸质卷子和微信群发答案,教务老师光整理错题就要加班到半夜。他想做个题库小程序,让学员在手机上练题、自动判分、后台能看数据。
这类需求在本地其实不少见:驾校、会计培训、教师资格、建造师、医考,石家庄做职业教育的机构密度不低,题库几乎是个刚需。但真正动手做,坑比想象中多。这篇文章就把我踩过的三个坑摊开讲讲,给准备做题库小程序的同行和客户一点参考。
坑一:以为题库就是“题目列表”,结果数据结构先崩了
很多人第一反应是建一张题目表:题干、选项A/B/C/D、答案。听着没问题,但一上真题就露馅。单选、多选、判断、填空、材料题(一个大案例带五个小题)、甚至带图片和公式的题,全塞进一张表,字段很快就变成一堆 option_e、option_f 这种凑数的列。
我的做法是把题目拆成三层:
- 题库(bank):一门考试一个题库,比如“初级会计实务”。
- 题目(question):只存题干、题型、解析、难度,选项单独存。
- 选项(option):一对多挂在题目下,支持任意数量,判断题就是两个选项。
材料题再单独加一层 parent_id,子题挂到材料题下面。这样后台录题时,教务老师看到的是一棵结构清晰的树,而不是一张宽表。微信小程序的云开发数据库对嵌套支持一般,所以我更倾向用平铺集合加关联字段,查询时在云函数里组装。
// 题目集合的简化结构
{
_id: "q_1024",
bankId: "bank_cjkj",
type: "multi", // single / multi / judge / blank
stem: "下列哪些属于流动资产?",
options: [
{ key: "A", text: "库存现金" },
{ key: "B", text: "固定资产" },
{ key: "C", text: "应收账款" }
],
answer: ["A", "C"],
analysis: "固定资产属于非流动资产……",
parentId: null
}坑二:判分逻辑写在前端,等于把答案送给了用户
这是最容易被忽略的一点。小程序包体是可以被解包查看的,如果答案和判分逻辑都写在前端 JS 里,稍微懂点技术的学员就能把整套答案导出来。对培训机构来说,这是直接损失。
正确的做法是:拉题时不返回答案,交卷时把作答提交到云函数,由服务端判分并回传结果和解析。 云函数里判分逻辑也很简单,但一定要放在服务端。
// 云函数 gradeExam
const { answers } = event // [{ qid, picked: ["A"] }]
const ids = answers.map(a => a.qid)
const { data: questions } = await db.collection('question')
.where({ _id: _.in(ids) }).get()
let score = 0
const detail = answers.map(ans => {
const q = questions.find(x => x._id === ans.qid)
const right = q.answer.sort().join(',') === ans.picked.sort().join(',')
if (right) score++
return { qid: ans.qid, right, answer: q.answer, analysis: q.analysis }
})
return { score, detail }顺带说一句,错题本也依赖这个结果。学员答错的题自动进错题集,下次只练错题,这是题库产品留存的关键功能,比“每日一练”更能留住人。
坑三:只做练习,不做“考试感”,学员用两天就跑了
我见过不少题库小程序,功能就是无限刷题,没有进度、没有排名、没有模拟考。学员新鲜劲过了就不打开了。真正让题库活起来的,是几件小事:
- 章节进度条:练到第几章、正确率多少,一眼能看到,有推进感。
- 限时模拟考:按真实考试时长倒计时,交卷出分,这个仪式感很重要。
- 错题重练:错题连续答对两次才移出错题本,符合记忆规律。
- 后台数据看板:机构最关心的是哪些题错误率高,用来调整面授重点。
那位石家庄的朋友上线三个月后反馈,学员平均每周打开次数从 1.2 次涨到 4 次多,教务老师也不用再在群里发答案了。后台的错题统计还被他们拿去做了教研材料,算是意外收获。
给准备做题库的本地客户几句实话
题库小程序看着简单,实际是个“数据 + 判分 + 运营”的组合活。如果只是想让学员有个地方刷题,用云开发做一版 MVP,两三周能跑起来;但如果要接支付、做会员、多机构共用,架构就得提前想清楚,别等数据量上来了再重构。
在石家庄做这类项目,我一般建议客户先把题目数据整理好再谈开发,因为录题的工作量往往比写代码还大。知码客这边接过的几个本地培训类项目,都是先帮客户把题库结构定下来,再进入开发,返工少很多。毕竟对做题库来说,代码是骨架,题目才是血肉,骨架搭对了,后面加什么功能都顺手。
评论 (0)
还没有评论,快来抢沙发吧~