基于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
前端
- Vue.js2 全家桶
- Element-UI
- vue-admin-template 后台模板
- axios
- 图表:v-charts(ECharts)
- 富文本编辑器:wangEditor
- 等等
数据库: 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) | 否 | 手机号 | ||
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) | 否 | 手机号 | ||
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
管理员端:
讲师端:
学员端:
事实说明,毕设工作量完全超出了答辩的正常范围,这点我是没想到的,因为只演示了系统一小部分功能就拿了答辩优秀。最后也是希望本项目可以给到有需要的人一些帮助。谢谢大家。
展望:
- 代码重构,解决前言中的问题。
- 功能完善,完善支付模块、权限管理等功能。
- 架构升级,微服务拆分,引入前沿技术。
当然,这一切的前提是我心情不错且拥有足够的空闲时间。