一个基于SpringBoot的在线教育系统「源码开源」

1. 技术介绍

  • 核心技术:SpringBoot+mybatis;
  • 前端:layui;
  • 开发工具:idea;
  • 数据库:mysql5.7;
  • 模版引擎:thymeleaf;
  • 安全框架:SpringSecurity;
  • 日志框架:logback;
  • 数据库连接池:druid;
  • 在线编辑器:ckeditor;
  • 图片轮播组件:jQuerySwipeslider;

2.功能介绍

本项目分前台用户界面功能和后台管理功能;

  • 前台用户界面功能:
  • 滚动大条幅展示重要通知和课程或者活动;
  • 展示课程,根据实际业务需求,展示课程推荐,最新课程,免费课程,实战课程;
  • 课程搜索,用户输入指定课程关键字,可以搜索查询,也可以根据课程类别分类,和类型进行搜索;
  • 课程详细展示
  • 用户登陆
  • 在线支付

后台管理功能:

  • 管理员登录
  • 课程管理
  • 课程类别管理
  • 用户管理
  • 授课老师管理
  • 订单管理
  • 菜单管理
  • 友情链接管理
  • 系统属性管理
  • 自定义帖子管理
  • 轮转图片帖子管理

3. 前端

3.1 首页

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

3.2 课程

提供按照课程的类别,类型以及搜索框进行快速查询相关课程

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

点击任意一门课程,免费课程可以直接观看,vip课程则需要通过支付宝或者微信缴费开通vip进行观看

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

3.3 登入

学习课程时候需要登录才能观看相关视频资料

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

登入后可以查看个人中心的相关功能

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

在我的订单界面可以查看已经购买的课程

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

3.4 商品兑换

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

3.5 课程发布

在课程发布页面可以提交发布的课程资料

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

在我的发布页面可以查看所有已经发布的课程相关信息,查看审核状态

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4. 后端

4.1 登录

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.2 系统管理

包括用户管理,角色管理,菜单管理,可以查看对应的信息并添加,导入,修改或删除

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

角色管理界面可以为角色分配权限

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.3 课程管理

可以添加课程,对课程进行分类管理:公共课程,专业课程,免费课程等

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

在类别管理中可以添加课程的分类信息

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

在审核功能处可以对上传的视频进行审核

4.4 教师管理

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.5 导航菜单

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.6 轮播管理

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.7 通知管理

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

4.8 礼品管理

一个月爆肝一个基于SpringBoot的在线教育系统「源码开源」

5,系统的核心代码

/**
 * 操作日志记录注解
 * Created by xiaomeng 2020-03-21 17:03
  *技术交流v:kaifazixun
 * 操作日志记录注解
 * Created by wangfan on 2020-03-21 17:03
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperLog {
 
    /**
     * 模块
     */
    String value();
 
    /**
     * 功能
     */
    String desc();
 
    /**
     * 是否记录请求参数
     */
    boolean param() default true;
 
    /**
     * 是否记录返回结果
     */
    boolean result() default false;
 
}*
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperLog {
 
    /**
     * 模块
     */
    String value();
 
    /**
     * 功能
     */
    String desc();
 
    /**
     * 是否记录请求参数
     */
    boolean param() default true;
 
    /**
     * 是否记录返回结果
     */
    boolean result() default false;
 
@Aspect
@Component
public class OperLogAspect {
    private ThreadLocal<Long> startTime = new ThreadLocal<>();
    @Autowired
    private OperRecordService operRecordService;
 
    @Pointcut("@annotation(com.egao.common.core.annotation.OperLog)")
    public void operLog() {
    }
 
    @Before("operLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        startTime.set(System.currentTimeMillis());
    }
 
    @AfterReturning(pointcut = "operLog()", returning = "result")
    public void doAfterReturning(JoinPoint joinPoint, Object result) {
        saveLog(joinPoint, result, null);
    }
 
    @AfterThrowing(value = "operLog()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
        saveLog(joinPoint, null, e);
    }
 
    private void saveLog(JoinPoint joinPoint, Object result, Exception e) {
        // 获取reques对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (attributes == null ? null : attributes.getRequest());
        // 构建操作日志
        OperRecord operRecord = new OperRecord();
        operRecord.setUserId(getLoginUserId());
        if (startTime.get() != null) operRecord.setSpendTime(System.currentTimeMillis() - startTime.get());
        if (request != null) {
            operRecord.setRequestMethod(request.getMethod());
            operRecord.setUrl(request.getRequestURI());
            operRecord.setIp(UserAgentGetter.getIp(request));
        }
        // 记录异常信息
        if (e != null) {
            operRecord.setState(1);
            operRecord.setComments(StrUtil.sub(e.toString(), 0, 2000));
        }
public class BaseController {
 
    /**
     * 获取当前登录的user
     */
    public User getLoginUser() {
        Subject subject = SecurityUtils.getSubject();
        if (subject == null) return null;
        Object object = subject.getPrincipal();
        if (object != null) return (User) object;
        return null;
    }
 
    /**
     * 获取当前登录的userId
     */
    public Integer getLoginUserId() {
        User loginUser = getLoginUser();
        return loginUser == null ? null : loginUser.getUserId();
    }
 
}
/**
 * 用户管理
 * Created by xiaomeng 2020-12-24 16:10
*技术交流V:kaifazixun
 */
@Controller
@RequestMapping("/sys/user")
public class UserController extends BaseController {
    @Autowired
    private UserService userService;
    @Autowired
    private DictionaryDataService dictionaryDataService;
    @Autowired
    private RoleService roleService;
    @Autowired
    private OrganizationService organizationService;
 
    @RequiresPermissions("sys:user:view")
    @RequestMapping()
    public String view(Model model) {
        model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex"));
        model.addAttribute("organizationTypeList", dictionaryDataService.listByDictCode("organization_type"));
        model.addAttribute("rolesJson", JSON.toJSONString(roleService.list()));
        return "system/user.html";
    }
 
    /**
     * 个人中心
     */
    @RequestMapping("/info")
    public String userInfo(Model model) {
        model.addAttribute("user", userService.getFullById(getLoginUserId()));
        model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex"));
        return "index/user-info.html";
    }
 
    /**
     * 分页查询用户
     */
    @OperLog(value = "用户管理", desc = "分页查询")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/page")
    public PageResult<User> page(HttpServletRequest request) {
        PageParam<User> pageParam = new PageParam<>(request);
        pageParam.setDefaultOrder(null, new String[]{"create_time"});
        return userService.listPage(pageParam);
    }
 
    /**
     * 查询全部用户
     */
    @OperLog(value = "用户管理", desc = "查询全部")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/list")
    public JsonResult list(HttpServletRequest request) {
        PageParam<User> pageParam = new PageParam<>(request);
        List<User> records = userService.listAll(pageParam.getNoPageParam());
        return JsonResult.ok().setData(pageParam.sortRecords(records));
    }
 
    /**
     * 根据id查询用户
     */
    @OperLog(value = "用户管理", desc = "根据id查询")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/get")
    public JsonResult get(Integer id) {
        PageParam<User> pageParam = new PageParam<>();
        pageParam.put("userId", id);
        List<User> records = userService.listAll(pageParam.getNoPageParam());
        return JsonResult.ok().setData(pageParam.getOne(records));
    }
/**
 * 用户管理
 * Created by xiaomeng 2020-12-24 16:10
*技术交流V:kaifazixun
 */
@Controller
@RequestMapping("/sys/user")
public class UserController extends BaseController {
    @Autowired
    private UserService userService;
    @Autowired
    private DictionaryDataService dictionaryDataService;
    @Autowired
    private RoleService roleService;
    @Autowired
    private OrganizationService organizationService;
 
    @RequiresPermissions("sys:user:view")
    @RequestMapping()
    public String view(Model model) {
        model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex"));
        model.addAttribute("organizationTypeList", dictionaryDataService.listByDictCode("organization_type"));
        model.addAttribute("rolesJson", JSON.toJSONString(roleService.list()));
        return "system/user.html";
    }
 
    /**
     * 个人中心
     */
    @RequestMapping("/info")
    public String userInfo(Model model) {
        model.addAttribute("user", userService.getFullById(getLoginUserId()));
        model.addAttribute("sexList", dictionaryDataService.listByDictCode("sex"));
        return "index/user-info.html";
    }
 
    /**
     * 分页查询用户
     */
    @OperLog(value = "用户管理", desc = "分页查询")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/page")
    public PageResult<User> page(HttpServletRequest request) {
        PageParam<User> pageParam = new PageParam<>(request);
        pageParam.setDefaultOrder(null, new String[]{"create_time"});
        return userService.listPage(pageParam);
    }
 
    /**
     * 查询全部用户
     */
    @OperLog(value = "用户管理", desc = "查询全部")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/list")
    public JsonResult list(HttpServletRequest request) {
        PageParam<User> pageParam = new PageParam<>(request);
        List<User> records = userService.listAll(pageParam.getNoPageParam());
        return JsonResult.ok().setData(pageParam.sortRecords(records));
    }
 
    /**
     * 根据id查询用户
     */
    @OperLog(value = "用户管理", desc = "根据id查询")
    @RequiresPermissions("sys:user:list")
    @ResponseBody
    @RequestMapping("/get")
    public JsonResult get(Integer id) {
        PageParam<User> pageParam = new PageParam<>();
        pageParam.put("userId", id);
        List<User> records = userService.listAll(pageParam.getNoPageParam());
        return JsonResult.ok().setData(pageParam.getOne(records));
    }
/**
 * 字典管理
 * Created by xiaomeng on 2021-03-14 11:29:03
 * 技术交流加v:kafazixun
 */
@Controller
@RequestMapping("/sys/dict")
public class DictionaryController extends BaseController {
    @Autowired
    private DictionaryService dictionaryService;
 
    @RequiresPermissions("sys:dict:view")
    @RequestMapping()
    public String view() {
        return "system/dictionary.html";
    }
 
    /**
     * 分页查询字典
     */
    @OperLog(value = "字典管理", desc = "分页查询")
    @RequiresPermissions("sys:dict:list")
    @ResponseBody
    @RequestMapping("/page")
    public PageResult<Dictionary> page(HttpServletRequest request) {
        PageParam<Dictionary> pageParam = new PageParam<>(request);
        return new PageResult<>(dictionaryService.page(pageParam, pageParam.getWrapper()).getRecords(), pageParam.getTotal());
    }
 
    /**
     * 查询全部字典
     */
    @OperLog(value = "字典管理", desc = "查询全部")
    @RequiresPermissions("sys:dict:list")
    @ResponseBody
    @RequestMapping("/list")
    public JsonResult list(HttpServletRequest request) {
        PageParam<Dictionary> pageParam = new PageParam<>(request);
        return JsonResult.ok().setData(dictionaryService.list(pageParam.getOrderWrapper()));
    }
 
    /**
     * 根据id查询字典
     */
    @OperLog(value = "字典管理", desc = "根据id查询")
    @RequiresPermissions("sys:dict:list")
    @ResponseBody
    @RequestMapping("/get")
    public JsonResult get(Integer id) {
        return JsonResult.ok().setData(dictionaryService.getById(id));
    }

万岳在线教育系统源码一个源码开源,支持个性化定制,快速搭建部署线上教育独立品牌。多终端网校授课系统,支持大班课、小班课、一对一授课模式,还原真实线下教学场景。 万岳在线教育系统源码应用场景: 小班课 支持16位学员和老师同时视频连麦,内置白板、课堂测试、在线抢答等多种趣味教学工具。可实现一对一、一对多互动教学模式。 包含:直播授课、教学白板、屏幕共享、连麦互动、随堂测试、在线抢答 大班课 包含语音大班课和视频大班课两种模式,万人可同时在线;语音大班课支持视频、音频、PPT教学方式,而视频大班课主要以讲座形式展现。 包含:直播授课、文字互动、课堂展示、语音互动、教学白板、屏幕共享 双师教学 主讲老师线上授课,辅导老师答疑督学、维持课堂纪律,从而构建健康的授课直播环境。 包含:直播授课、课件共享、连麦互动、教学白板、屏幕共享 内容付费 拥有知识付费和课程付费两种模式,内容分为视频、图文和语音三种展现形式, 学员能通过免费、密码、付费三种方式获取相关课程。 包含:直播授课、课件共享、连麦互动、教学白板、屏幕共享 万岳在线教育系统源码功能展示: 录播回看 系统能将课程直播实况全程录下,学员可凭此功能及时参与补课。 网课购买 网课以视频、音频或图文形式展示,课程分类一目了然,学员可凭意愿购买。 营销工具 预设各类优惠劵、团购劵、限时促销等营销工具和方案,助力学员网课购买。 教学白板 含画笔、文本框、橡皮擦等,支持PPT展示、书写标记、共享桌面等操作。 随堂测试 含三种课堂问卷,分为选择题、判断题和应用题,讲师可在开课前预设问卷。 屏幕共享 在小班课模式中,讲师可在直播间内共享自己的电脑桌面,并邀请学员操作。 课程管理 后台可对课程进行快速分类和排序操作,并统计当前课程评价和打分人数。 学员管理 后台能对学员ID、学习进度、测试成绩等进行全面统计,掌控学员状态。 互动视频连麦 小班课中,学员可申请上台与讲师视频连麦,最多支持16名学员同时连麦。 万岳在线教育系统源码产品参数如下:  万岳在线教育系统源码开发语言 1、Android端APP:Java 2、ios端APP:Object-c  3、管理后台服务端:php 4、采用框架:ThinkPHP 万岳在线教育系统源码服务器参数 5、数据库:Mysql 6、缓存服务器:Redis 7、聊天服务器:Socket 万岳在线教育系统源码传输协议和媒体格 8、推流 :RTMP 9、拉流 RTMP和HTTP 10、音频格式:ACC 11、 视频格式:H.264 万岳在线教育系统源码服务器配置 操作系统:linux CentOS 服务器,建议购买境内的服务器 源码安装步骤如下: <1>关闭防火墙并设置开机关闭------>systemctl stop firewalld  && systemctl disable firewalld <2>确保服务器开放以下端口:21 22 80 888  8888  3306  6379  19967  39000-40000(ftp被动模式端口,不用可以不打开) <3>宝塔面板也需要开放以下端口:21 22 80  888  8888  3306 6379(下面有介绍)  19967  39000-40000(ftp被动模式端口,不用可以不打开) 1.宝塔面板安装命令 1.1、 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh   执行完成后给出默认的登录URL、用户名和密码 1.2、根据上面安装成功的地址登录宝塔面板后台,我们需要去设置网站环境。 1.3、登录成功后执行一键安装lnmp,具体版本如下: nginx版本1.15  MySQL 5.7    php 7.0  phpmyadmin 4.7   安装方式为极速安装 1.4、等宝塔程序自动安装完毕之后,我们就可以去左侧菜单创建站点、数据库等应用。 1.5、此时环境lnmp搭建好,但是redis和php插件  如opchache  redis  fileinfo都需要安装下 1.6、找到redis安装下 1.7、同理安装下PHP扩展插件 1.8、此时网站整体环境搭建好了,但是还需要确认下宝塔面板以下端口是否开放,没开放的话直接打开(上面一开始开放的部分是服务器开放的端口,别混淆了) 2.设置宝塔面板安全 进入后台,设置——面板设置。 默认宝塔面板端口、用户、密码都需要修改,确保服务器的安全。 3.redis配置 修改redis配置信息 重启redis 4.添
评论 3 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页

打赏作者

Javaesandyou

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值