基于SpringBoot+Vue前后端分离的在线教育平台项目
赠给有缘人,希望能帮助到你!也请不要吝惜你的大拇指,你的Star、点赞将是对我最大的鼓励与支持!
开源传送门:
演示DEMO传送门:
前言
本项目是笔者毕设作品,肝了一周多时间赶出来的,后台写得比较垃圾,前端界面自我感觉还行,但笔者前端只是打辅助的。总的参考价值因人而言。
- 随心所欲,只为功能实现,没有规范,没有优化,不谈安全;
- Service层没有接口,实现直接返回Controller结果,因而造成代码大量耦合,拓展性极差;
- MyBatis-Plus直接面向对象Dao操作,没有写SQL语句,业务逻辑全部使用JAVA代码完成;
- 仍存在较多缺陷,但显示到的菜单功能基本都是完整的,除了支付功能。
关于项目演示:出于多种考虑,演示DEMO中关于修改的操作全部禁用。如果需要了解完整的项目演示效果,请本地测试运行项目,自行在配置文件配置阿里云OSS和VoD相关选项。
鸣谢:部分界面设计元素参考腾讯课堂与龙果学院。
项目介绍
基于SpringBoot+Vue前后端分离的在线教育平台项目,单体应用服务架构。
系统共设计三种角色:管理员、讲师和学员,三个角色分别对应一个操作端。也就是本系统1个后台项目,三个前端项目。管理员端没有引入角色和权限管理,只有一个角色。
已实现的功能列表展示:
管理员端:
- 数据统计
- 轮播图管理
- 课程管理
- 讲师管理
- 学员管理
- 用户管理
- 订单管理
讲师端:
学员端(网站首页):
技术选型
开发环境
- 工具:IntelliJ IDEA
- JDK 1.8
- 数据库:MySQL 8.0.15
- 项目构建:后端Maven、前端 webpack
后端
- Web框架:Spring Boot
- 字段校验:Spring Validation
- 持久层:MyBatis-Plus
- 接口文档:Swagger2
- Lombok:请确保您的 IDE 安装了此插件
- 缓存:Redis
- 工具:Hutool
- 资源存储:阿里云对象存储OSS
- 课程视频点播:阿里云视频点播VoD
前端
数据库设计

数据库: online_edu,统一编码:utf8mb4
表格: acl_permission
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
菜单权限表 |
| pid |
int(11) unsigned |
否 |
|
|
父级id |
| type |
tinyint(4) unsigned |
否 |
1 |
|
菜单类型,0顶部菜单、1聚合菜单、2页面菜单、3接口 |
| name |
varchar(255) |
是 |
|
|
路由名称或接口名称 |
| path |
varchar(255) |
否 |
|
|
菜单路径(以http开头时,视为打开外部链接) 或 请求接口的地址 |
| component |
varchar(255) |
是 |
|
|
菜单组件,只有叶子菜单才可配置 |
| meta |
varchar(1023) |
是 |
<空> |
|
菜单的route.meta配置项,json格式 |
| admin |
tinyint(1) unsigned |
否 |
0 |
|
0默认,1只有超级管理员才能使用 |
| enable |
tinyint(1) unsigned |
否 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: acl_role
备注: 角色
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
角色id |
| name |
varchar(31) |
否 |
|
|
角色名称 |
| permission_id |
varchar(2048) |
是 |
|
|
角色具有的权限ID串 |
| enable |
tinyint(1) |
是 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: acl_user
备注: 管理员用户表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| uk_username |
username |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
用户id |
| username |
varchar(31) |
否 |
|
|
用户名 |
| password |
varchar(255) |
否 |
|
|
密码 |
| nickname |
varchar(31) |
是 |
|
|
昵称 |
| avatar |
varchar(1023) |
是 |
|
|
用户头像 |
| mark |
varchar(255) |
是 |
|
|
备注 |
| sign |
varchar(255) |
是 |
|
|
用户签名 |
| roleId |
int(11) unsigned |
否 |
|
|
角色id |
| enable |
tinyint(1) unsigned |
否 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_chapter
备注: 课程章节表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
章节ID |
| course_id |
int(11) unsigned |
否 |
|
|
课程ID |
| title |
varchar(63) |
否 |
|
|
章节名称 |
| sort |
int(11) |
是 |
0 |
|
显示排序 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_chapter_tmp
备注: 课程章节临时表(用于存放二次修改的数据)
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_id |
oid |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
bigint(20) unsigned |
否 |
0 |
|
主键 |
| oid |
int(11) unsigned |
是 |
0 |
|
原章节ID |
| course_id |
int(11) unsigned |
否 |
|
|
课程ID |
| title |
varchar(63) |
否 |
|
|
章节名称 |
| sort |
int(11) |
是 |
0 |
|
显示排序 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_comment
备注: 课程评论表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_course_id |
course_id |
|
|
| idx_member_id |
member_id |
|
|
| idx_member_id_course_id |
member_id, course_id |
|
|
| idx_teacher_id |
teacher_id |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
评论ID |
| course_id |
int(11) unsigned |
否 |
|
|
课程id |
| teacher_id |
int(11) unsigned |
否 |
|
|
讲师id |
| member_id |
int(11) unsigned |
否 |
|
|
会员id |
| content |
varchar(1023) |
是 |
|
|
评论内容 |
| mark |
double unsigned |
是 |
5 |
|
评分(满分5.00) |
| status |
tinyint(1) unsigned |
是 |
<空> |
|
评论状态 0审核中 1通过 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_course
备注: 课程表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
课程ID |
| teacher_id |
int(11) unsigned |
否 |
|
|
课程讲师ID |
| subject_id |
int(11) unsigned |
否 |
|
|
课程科目分类ID |
| title |
varchar(63) |
否 |
|
|
课程标题 |
| price |
double(10,2) unsigned |
是 |
0.00 |
|
课程销售价格,设置为0则可免费观看 |
| lesson_num |
int(11) unsigned |
否 |
0 |
|
总课时 |
| cover |
varchar(1023) |
否 |
|
utf8, utf8_general_ci |
课程封面图片路径 |
| description |
text |
是 |
|
|
课程描述 |
| buy_count |
int(11) unsigned |
是 |
0 |
|
销售数量 |
| view_count |
int(11) unsigned |
是 |
0 |
|
浏览数量 |
| sort |
int(11) |
是 |
0 |
|
显示排序 |
| enable |
tinyint(1) |
否 |
1 |
|
上架下架,0下架 1上架 |
| status |
tinyint(4) |
是 |
0 |
|
课程状态,草稿 审核 发表 |
| remarks |
varchar(511) |
是 |
<空> |
|
备注 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_subject
备注: 课程科目分类表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_parent_id |
parent_id |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
课程类别ID |
| title |
varchar(15) |
否 |
|
|
类别名称 |
| parent_id |
int(11) unsigned |
是 |
0 |
|
父ID |
| sort |
int(11) unsigned |
是 |
0 |
|
排序字段 |
| enable |
tinyint(1) unsigned |
否 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_teacher
备注: 讲师表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| uk_mobile |
mobile |
unique |
|
| uk_name |
name |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
讲师ID |
| mobile |
char(11) |
否 |
|
|
手机号 |
| email |
varchar(127) |
是 |
|
|
邮箱地址 |
| password |
varchar(255) |
否 |
|
|
密码 |
| name |
varchar(63) |
否 |
|
|
讲师姓名 |
| intro |
varchar(1023) |
否 |
|
|
讲师简介 |
| avatar |
varchar(1023) |
是 |
|
|
讲师头像 |
| resume |
varchar(1023) |
是 |
|
|
讲师简历链接 |
| division |
tinyint(4) |
是 |
80 |
|
分成比例,0-100 |
| sort |
int(11) |
是 |
0 |
|
排序 |
| enable |
tinyint(1) unsigned |
否 |
1 |
|
是否启用,0否1是 |
| status |
tinyint(4) |
是 |
0 |
|
讲师状态:审核通过;审核不通过;待审核 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_video
备注: 课程视频
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_chapter_id |
chapter_id |
|
|
| idx_course_id |
course_id |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
视频ID |
| course_id |
int(11) unsigned |
否 |
|
|
课程ID |
| chapter_id |
int(11) unsigned |
否 |
|
|
章节ID |
| title |
varchar(63) |
否 |
|
|
视频显示名称 |
| video_id |
varchar(63) |
否 |
|
|
云端视频资源 |
| sort |
int(11) |
是 |
0 |
|
排序字段 |
| play_count |
int(11) unsigned |
是 |
0 |
|
播放次数 |
| free |
tinyint(1) unsigned |
是 |
1 |
|
是否可以试听:0免费 1收费 |
| duration |
varchar(15) |
是 |
0 |
|
视频时长(秒) |
| size |
bigint(20) unsigned |
否 |
0 |
|
视频源文件大小(字节) |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: edu_video_tmp
备注: 课程视频表(用于存放二次修改的数据)
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_chapter_id |
chapter_id |
|
|
| idx_course_id |
course_id |
|
|
| idx_id |
oid |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
bigint(20) unsigned |
否 |
0 |
|
主键(视频ID) |
| oid |
int(11) unsigned |
是 |
0 |
|
原视频ID |
| course_id |
int(11) unsigned |
否 |
|
|
课程ID |
| chapter_id |
bigint(20) unsigned |
否 |
|
|
章节ID |
| title |
varchar(63) |
否 |
|
|
视频显示名称 |
| video_id |
varchar(63) |
否 |
|
|
云端视频资源 |
| sort |
int(11) |
是 |
0 |
|
排序字段 |
| play_count |
int(11) unsigned |
是 |
0 |
|
播放次数 |
| free |
tinyint(1) unsigned |
是 |
1 |
|
是否可以试听:0免费 1收费 |
| duration |
varchar(15) |
是 |
0 |
|
视频时长(秒) |
| size |
bigint(20) unsigned |
否 |
0 |
|
视频源文件大小(字节) |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: hm_banner
备注: 首页banner表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
ID |
| title |
varchar(63) |
是 |
|
|
标题 |
| image_url |
varchar(1023) |
否 |
|
|
图片地址 |
| link_url |
varchar(1023) |
是 |
|
|
链接地址 |
| sort |
int(11) unsigned |
否 |
0 |
|
排序 |
| enable |
tinyint(1) unsigned |
否 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: rel_course_member
备注: 课程订阅-学员关系表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_course_id |
course_id |
unique |
|
| idx_member_course |
member_id, course_id |
|
联合索引(member_id, course_id) |
| idx_member_id |
member_id |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(10) unsigned |
否 |
<auto_increment> |
|
主键 |
| course_id |
int(10) unsigned |
否 |
0 |
|
课程Id |
| member_id |
int(10) unsigned |
否 |
0 |
|
学员Id |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: stat_daily
备注: 网站统计日数据
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| statistics_day |
date |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
主键 |
| date |
datetime |
否 |
|
|
统计日期 |
| visit_count |
int(11) unsigned |
是 |
0 |
|
访客数量 |
| register_count |
int(11) unsigned |
是 |
0 |
|
注册人数 |
| login_count |
int(11) unsigned |
是 |
0 |
|
活跃人数 |
| video_view_count |
int(11) unsigned |
是 |
0 |
|
视频播放数 |
| course_buy_count |
int(11) unsigned |
是 |
0 |
|
购买数量 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: sys_message
备注: 消息表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_to_id |
to_id |
|
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
消息id |
| from_id |
int(11) unsigned |
否 |
0 |
|
发送者Id |
| from_role |
tinyint(4) |
否 |
0 |
|
发送者角色(管理员、讲师…) |
| to_id |
int(11) unsigned |
否 |
0 |
|
接受者id |
| to_role |
tinyint(4) unsigned |
否 |
0 |
|
接受者角色(教师、学员…) |
| title |
varchar(127) |
是 |
|
|
消息标题 |
| content |
varchar(511) |
否 |
|
|
消息内容 |
| has_read |
tinyint(1) unsigned |
是 |
0 |
|
是否已读(0未读 1已读) |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: t_order
备注: 订单表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| idx_course_id |
course_id |
|
|
| idx_member_id |
member_id |
|
|
| idx_member_id_course_id |
member_id, course_id |
|
|
| ux_order_no |
order_no |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
|
| order_no |
varchar(18) |
否 |
|
|
订单号(datetime+unsigned int) |
| course_id |
int(11) unsigned |
否 |
|
|
课程id |
| member_id |
int(11) unsigned |
否 |
|
|
会员id |
| total_fee |
double(10,2) |
是 |
0.01 |
|
订单金额(分) |
| pay_type |
tinyint(4) unsigned |
是 |
0 |
|
支付类型(0 未支付 1:微信 2:支付宝) |
| transaction_num |
varchar(31) |
是 |
|
|
交易流水号 |
| pay_time |
datetime |
是 |
<空> |
|
支付完成时间 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
表格: uctr_member
备注: 会员表
索引:
| 名称 |
类型 |
属性 |
备注 |
| 主索引 |
id |
unique |
|
| uk_mobile |
mobile |
unique |
|
| uk_nickname |
nickname |
unique |
|
字段:
| 名称 |
类型 |
空 |
默认值 |
属性 |
备注 |
| id |
int(11) unsigned |
否 |
<auto_increment> |
|
会员id |
| mobile |
char(11) |
否 |
|
|
手机号 |
| email |
varchar(127) |
是 |
|
|
邮箱地址 |
| password |
varchar(255) |
否 |
|
|
密码 |
| nickname |
varchar(31) |
是 |
|
|
昵称 |
| sex |
tinyint(4) unsigned |
是 |
0 |
|
性别 1 女,2 男 |
| age |
tinyint(3) unsigned |
是 |
0 |
|
年龄 |
| avatar |
varchar(1023) |
是 |
|
|
用户头像 |
| sign |
varchar(127) |
是 |
|
|
用户签名 |
| enable |
tinyint(1) |
是 |
1 |
|
是否启用,0否1是 |
| update_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
更新时间 |
| create_time |
datetime |
是 |
<INSERT-TimeStamp> |
|
创建时间 |
实现效果
更多实现效果图请看附件README.assets
管理员端:

讲师端:

学员端:

总结与展望
事实说明,毕设工作量完全超出了答辩的正常范围,这点我是没想到的,因为只演示了系统一小部分功能就拿了答辩优秀。最后也是希望本项目可以给到有需要的人一些帮助。谢谢大家。
展望:
- 代码重构,解决前言中的问题。
- 功能完善,完善支付模块、权限管理等功能。
- 架构升级,微服务拆分,引入前沿技术。
当然,这一切的前提是我心情不错且拥有足够的空闲时间。
评论