1. 项目背景与核心需求
少儿体能早教服务在近年迎来爆发式增长,家长对3-12岁儿童的科学运动需求激增。传统线下机构存在课程不透明、效果难追踪等问题,而市面主流在线教育平台又缺乏针对体能训练的专业模块。这正是我们采用Node.js技术栈开发垂直类服务平台的契机。
这个毕业设计项目的核心要解决三个痛点:
- 家长端:实时查看训练计划/成果视频、预约私教课程、获取成长报告
- 教练端:课程排期管理、学员档案维护、训练方案定制
- 机构端:多校区运营管理、课程标准化输出、财务数据可视化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术选型
采用经典MEAN架构的变体:
- 前端:Uni-app(跨端兼容微信小程序+H5)
- 后端:Express 4.x(路由中间件优化版)
- 数据库:MySQL 8.0(JSON字段支持完善)
- 辅助工具:Redis缓存会话、阿里云OSS存储视频
特别说明:放弃MongoDB选择MySQL的原因在于早教业务存在大量关联查询(学员-课程-教练关系),且机构端需要严格的ACID事务支持。
2.2 核心模块划分
mermaid复制graph TD
A[用户系统] --> B[权限管理]
A --> C[成长档案]
D[课程系统] --> E[直播推流]
D --> F[训练计划]
G[运营系统] --> H[智能排课]
G --> I[财务统计]
3. 关键实现细节
3.1 微信小程序登录流程优化
采用双token机制解决频繁登录问题:
- 前端调用wx.login获取code
- 向服务端发送/auth接口请求
- 服务端用appid+secret换取openid
- 生成access_token(2h过期)和refresh_token(7天过期)
javascript复制// 典型错误处理逻辑
router.post('/auth', async (req, res) => {
try {
const { code } = req.body
const wxRes = await axios.get(`https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code`)
if(wxRes.data.errcode) {
throw new Error(wxRes.data.errmsg)
}
const tokens = generateTokens(wxRes.data.openid)
await redis.setEx(`token:${wxRes.data.openid}`, 7200, tokens.access_token)
res.json({...tokens, openid: wxRes.data.openid})
} catch (err) {
res.status(401).json({msg: '认证失败'})
}
})
3.2 训练视频处理方案
考虑到儿童体能的动作规范性要求,实现:
- 阿里云OSS分片上传(支持断点续传)
- FFmpeg转码处理(生成480P/720P双版本)
- OpenCV关键帧分析(自动标注标准动作点位)
bash复制# 典型视频处理命令
ffmpeg -i input.mp4 \
-vf "scale=w=640:h=360:force_original_aspect_ratio=decrease" \
-c:v libx264 -profile:v baseline -level 3.0 \
-c:a aac -strict experimental \
-movflags faststart \
output_480p.mp4
4. 数据库设计要点
4.1 核心表结构
| 表名 | 关键字段 | 索引设计 |
|---|---|---|
| member | id,openid,parent_phone,avatar | openid(唯一) |
| course | id,coach_id,type,duration,calorie | coach_id+type |
| order | id,member_id,course_id,pay_time | member_id+pay_time |
4.2 特殊字段处理
- 成长曲线数据:使用MySQL JSON类型存储百分位数据
sql复制ALTER TABLE member ADD COLUMN growth_data JSON DEFAULT NULL;
- 课程时间安排:采用bitmap存储每周重复时段
javascript复制// 每周一三五 10:00-11:00的存储示例
const schedule = {
weekday: 0b10101, // 二进制表示周1/3/5
hour: 10,
duration: 60
}
5. 性能优化实践
5.1 高并发场景应对
- 课程预约采用Redis原子计数器
javascript复制const remain = await redis.decr(`course:${courseId}:quota`)
if(remain < 0) {
await redis.incr(`course:${courseId}:quota`) // 回滚
throw new Error('已约满')
}
- 使用PM2集群模式启动
bash复制pm2 start app.js -i max --node-args="--max-old-space-size=2048"
5.2 缓存策略设计
- 课程详情:5分钟本地缓存+Redis二级缓存
- 教练信息:LRU内存缓存+MySQL热备
- 机构数据:定时任务预生成统计报表
6. 安全防护措施
- 接口防刷:koa-ratelimit限制关键接口
javascript复制app.use(ratelimit({
driver: 'redis',
db: redis,
duration: 60000,
max: 30
}))
- 敏感操作二次验证:
- 删除课程需要短信验证码
- 修改成长档案记录操作日志
- 视频防盗链:OSS签名URL+Referer白名单
7. 项目部署方案
7.1 生产环境配置
nginx复制server {
listen 443 ssl;
server_name api.pe-training.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
}
7.2 监控体系搭建
- ELK收集访问日志
- Prometheus监控服务器指标
- 企业微信机器人告警
8. 开发经验总结
- 微信支付踩坑:沙箱环境必须用特制签名算法
- MySQL连接池配置:建议wait_timeout设置为3600
- 视频处理优化:使用GPU加速转码效率提升5倍
项目完整代码已托管在Gitee私有仓库,包含详细开发文档和API说明。这个项目在答辩时获得优秀成绩,关键创新点在于将儿童体适能评估标准数字化,并通过可视化图表展示成长轨迹。
