导读(3行收益):在线课程发证书最容易乱:学完了不知道、证书手动发、下载打不开。本文给一套做法:完成进度判定、证书模板生成、编号与下载,附建表 SQL。看完证书不会再靠教务手动做。
一、证书为什么发不出去
三个高发问题:
- 学完了不知道:没有完成判定,学员问什么时候拿证;
- 证书手动做:教务用图片软件一张张做;
- 证书编号重复:两个学员同一个号。
根源是把证书当图片,没有完成判定、没有模板、没有唯一编号。
二、完成度怎么算
CREATE TABLE `course_completion` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`course_id` BIGINT NOT NULL,
`progress` INT DEFAULT 0 COMMENT '0-100',
`finished_at` DATETIME,
UNIQUE KEY `uk_user_course` (`user_id`, `course_id`)
) COMMENT='课程完成度';
关键点:进度按小节算,看完多少小节除以总数;进度到 100 标 finished_at。避坑:进度按时长算——挂着不动也算;不记完成时间——证书日期乱写。
三、什么时候触发证书
| 条件 | 处理 |
|---|---|
| 进度 100% | 自动生成证书 |
| 有考试要求 | 考试通过才发 |
| 有作业要求 | 作业批改通过才发 |
关键点:满足条件自动发,不用教务手动。避坑:不管条件直接发——没看完也有证;手动发——漏发。
四、证书表怎么设计
CREATE TABLE `certificate` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`cert_no` VARCHAR(32) UNIQUE,
`user_id` BIGINT,
`course_id` BIGINT,
`issued_at` DATETIME,
`file_url` VARCHAR(255)
) COMMENT='结课证书';
关键点:cert_no 唯一,别重复;file_url 存生成好的图片/PDF。避坑:证书编号不唯一——两个学员同号;每次下载重新生成——慢且不一致。
五、证书长什么样
- 模板固定:课程名、学员名、日期、编号;
- 学员名和日期从数据填;
- 生成图片或 PDF 存起来。
避坑:证书上名字写错——学员投诉;日期乱写——和完成时间对不上;模板每次手改——不统一。
六、踩坑清单
- [ ] 没有完成判定;
- [ ] 证书手动做;
- [ ] 证书编号重复;
- [ ] 不记完成时间;
- [ ] 每次下载重新生成;
- [ ] 证书上名字/日期错;
- [ ] 有考试要求但不校验。
七、工程落地建议
结课证书建议按「完成度判定+条件触发+唯一编号+模板生成+存储下载」落地。若团队用成型教育平台(如乔拓云教育系统)起步,重点核对完成度判定、证书生成与下载是否可用。
八、复盘清单(可直接抄走)
- [ ] 是否按小节算完成度;
- [ ] 进度到 100% 是否自动触发;
- [ ] 证书编号是否唯一;
- [ ] 证书是否模板生成;
- [ ] 证书是否存好下载不重算;
- [ ] 有考试/作业要求是否校验。
结语
结课证书不是手动做图片,而是完成度自动判定、条件触发、唯一编号、模板生成存好。这几步做对,学员学完自动拿证。本文仅作技术分享,具体功能以各平台官方实时信息为准。