基于SpringBoot+Vue的在线学习平台设计与实现(源码+部署文档+讲解等)

🍅联系方式QQ------------------------1457321681----------------------------------------------🍅
博主介绍:✌10年以上互联网大厂项目经理、高校兼职讲师、创业导师、csdn特邀作者✌
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅
Java项目精品实战案例《100套》
Java微信小程序项目实战《100套》
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

开发系统:Windows10

架构模式:MVC/前后端分离

JDK版本:Java JDK1.8

开发工具:IDEA

数据库版本: mysql5.7

数据库可视化工具: navicat for mysql

服务器:SpringBoot自带 apache tomcat

2.使用技术
Springboot、Eureka、Gateway、Redis、Mysql等

3.系统截图
3.1后台首页

3.2讲师管理
在这里插入图片描述

3.3发布课程
在这里插入图片描述

3.4 轮播图管理
在这里插入图片描述

3.5订单管理

在这里插入图片描述

3.6用户端首页

3.7课程详情

在这里插入图片描述

3.8观看视频
在这里插入图片描述

3.9购买课程
在这里插入图片描述

3.10全部课程
在这里插入图片描述
在这里插入图片描述

4.部分代码

4.1 权限过滤器
package com.online.edu.gateway.filter;

@Component
@Slf4j
public class LoginFilter extends ZuulFilter {

@Autowired
private StringRedisTemplate stringRedisTemplate;


//定义过滤器的类型
@Override
public String filterType() {
    return "pre"; //pre类型过滤器
}

//过滤器执行顺序,返回值越小,越先执行
@Override
public int filterOrder() {
    return 0;
}

//决定是否执行下面的run方法
//如果返回false,表示过滤器放行,否则拦截,执行run
@Override
public boolean shouldFilter() {
    // 判断:访问的路径包含/vidservice/vod/getPlayAuth 进行校验
    //1 获取请求路径的 uri

    RequestContext currentContext = RequestContext.getCurrentContext();
    HttpServletRequest request = currentContext.getRequest();
    String requestURI = request.getRequestURI();

// System.out.println(“uri”+requestURI);

    String palyUrl = "/vidservice/vod/getPlayAuth";
    String courseInfo = "/online/frontcourse/getCourseInfo";
    //2 根据获取请求路径判断,路径中是否包含 /vidservice/vod/getPlayAuth

    if (!StringUtils.isEmpty(courseInfo) && requestURI.contains(courseInfo)){
        //3 如果包含,进行验证操作,return true
        return true;  //执行run方法,进行拦截
    }


    return false;
}

// 过滤器的执行逻辑
@Override
public ResultVO run() throws ZuulException {
System.out.println(“run方法执行了”);
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String authorization = request.getHeader(“Authorization”);

    System.out.println("authorization==" +authorization);
    //登录校验逻辑
    Claims claims = JwtUtils.checkJWT(authorization);
    String accesstoken = (String)claims.get("accesstoken");

    String userInfo = stringRedisTemplate.opsForValue().get(accesstoken);
    if (StringUtils.isEmpty(userInfo)){

        log.info("用户未登录");

// ResultVOUtil.error(10012,“未登录”);
// //为false时,不会继续向后执行
currentContext.setSendZuulResponse(false);

// //设置不能访问状态码
// currentContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
currentContext.setResponseBody(“{“status”:401,“msg”:“用户未登录 !”}”);
currentContext.getResponse().setContentType(“text/html;charset=UTF-8”);
}else{
log.info(“用户已登录”);
}

    return null;
}

}

4.2 教师管理
package com.online.edu.gdpuxjl.controller;

/**

  • 讲师 前端控制器
  • @author 许JIAN林
  • @since 2019-12-03
    */

@RestController
@RequestMapping(“/online/teachers”)
@CrossOrigin //跨域
@Slf4j
public class EduTeacherController {

@Autowired
private EduTeacherService eduTeacherService;


/**
 * 根据 ID 查找教师
 */
@ApiOperation(value = "查找所有讲师")
@GetMapping()
public ResultVO findTeacher() {
    log.info("【查询讲师】 查询所有讲师");
    List<EduTeacher> teacherList = eduTeacherService.list(null);
    return ResultVOUtil.success(teacherList);
}


/**
 * 根据 ID 查找教师
 */
@ApiOperation(value = "查找讲师")
@GetMapping("{id}")
public ResultVO findTeacher(@ApiParam(value = "讲师ID")
                            @PathVariable String id) {


    log.info("【查询讲师】 查询ID为" + id + "的讲师");
    EduTeacher eduTeacher = eduTeacherService.getById(id);
    if (eduTeacher != null) {

        return ResultVOUtil.success(eduTeacher);
    } else {
        return ResultVOUtil.error(ResultEnum.TEACHER_NOT_EXIST);
    }

}


/**
 * 根据 ID 修改教师信息
 */
@ApiOperation(value = "修改讲师信息")
@PutMapping("{id}")
public ResultVO updateTeacher(
        @ApiParam(value = "讲师ID")
        @PathVariable String id,
        @ApiParam(value = "所要修改的信息")
        @RequestBody EduTeacher eduTeacher) {


    log.info("【修改讲师信息】 修改id为" + id + "的讲师");
    int i = eduTeacherService.updateTeacher(id, eduTeacher);

    if (i == 1) {
        return ResultVOUtil.success();
    } else {
        return ResultVOUtil.error(ResultEnum.TEACHER_NOT_EXIST);
    }


}


@ApiOperation(value = "添加讲师")
@PostMapping()
public ResultVO addTeacher(
        @ApiParam(name = "teacherQuery", value = "查询对象")
        @RequestBody EduTeacher eduTeacher) {


    log.info("【保存讲师】 保存名字为" + eduTeacher.getName() + "的讲师");
    boolean save = eduTeacherService.save(eduTeacher);
    if (save) {
        return ResultVOUtil.success();
    } else {
        return ResultVOUtil.error(1, "失败");
    }

}

/**
 * 根据不同的条件查询讲师,分页显示 。
 */
@ApiOperation(value = "分页讲师列表")
@PostMapping("{page}/{limit}")
public ResultVO pageList(
        HttpServletResponse response,
        @ApiParam(name = "page", value = "当前页码", required = true)
        @PathVariable Long page,
        @ApiParam(name = "limit", value = "每页记录数", required = true)
        @PathVariable Long limit,
        @ApiParam(name = "teacherQuery", value = "查询对象", required = false)
        @RequestBody(required = false) TeacherQuery queryTeacher) {

    log.info("获取讲师信息");
    //封装page分页对象
    Page<EduTeacher> pageParam = new Page<>(page, limit);


    IPage<EduTeacher> eduTeacherIPage = eduTeacherService.pageQuery(pageParam, queryTeacher);

    HashMap<Object, Object> map = new HashMap<>();
    map.put("total", eduTeacherIPage.getTotal());
    map.put("items", eduTeacherIPage.getRecords());
    return ResultVOUtil.success(map);
}

/**
 * 根据 ID 删除教师
 */
@ApiOperation(value = "删除讲师")
@DeleteMapping("{id}")
public ResultVO removeById(@PathVariable String id) {
    log.info("【删除讲师】 删除id为:" + id + "的讲师");
    if (eduTeacherService.removeById(id)) {
        return ResultVOUtil.success();
    } else {
        return ResultVOUtil.error(ResultEnum.ERROR);

    }
}

}

4.3 课程管理

package com.online.edu.gdpuxjl.controller;

/**
 * <p>
 * 课程 前端控制器
 * </p>
 *
 */
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/online/course")
public class EduCourseController {


    @Autowired
    private EduCourseService eduCourseService ;

    @Autowired
    private EduCourseDescriptionService eduCourseDescriptionService ;


    //最终发布课程的方法,修改课程状态
    @ApiOperation("根据课程id修改课程状态")
    @GetMapping("publishCourse/{courseId}")
    public  ResultVO publishCourse(@PathVariable String courseId) {
        EduCourse eduCourse = new EduCourse();
        eduCourse.setId(courseId);
        eduCourse.setStatus("Normal");
        boolean result = eduCourseService.updateById(eduCourse);
        if(result) {
            return ResultVOUtil.success();
        } else {
            return ResultVOUtil.error(ResultEnum.ERROR);
        }
    }
    //根据课程id查询课程详细信息
    @ApiOperation("根据课程id查询课程详细信息")
    @GetMapping("getAllCourseInfo/{courseId}")
    public ResultVO getAllCourseInfo(@PathVariable String courseId) {
        log.info("根据课程id查询课程详细信息");
        CourseInfoVO courseInfoDto = eduCourseService.getCourseInfoAll(courseId);
        return ResultVOUtil.success("courseInfo",courseInfoDto);
    }


    //修改课程的方法
    @PostMapping("{id}")
    public ResultVO updateCourseInfo(@PathVariable String id,
                              @RequestBody CourseInfoDTO courseInfoDTO) {
        Boolean flag = eduCourseService.updateCourse(courseInfoDTO);
        if(flag) {
            return ResultVOUtil.success();
        } else {
            return ResultVOUtil.success();
        }
    }

    /**
     * 根据课程id查询课程
     * @param id
     * @return
     */
    @ApiOperation("根据课程id查询课程信息")
    @GetMapping("{id}")
    public ResultVO getCourseById(@ApiParam(name = "id", value = "课程id", required = true)
                                   @PathVariable String  id){
        log.info("【查询课程信息】 查询课程id为"+ id +"的信息");
        CourseInfoDTO courseInfoDTO = eduCourseService.findCourseById(id);

        return ResultVOUtil.success(courseInfoDTO);
    }
    /**
     * 根据课程id查询课程,提供给支付模块的接口
     * @param courseid
     * @return
     */
    @ApiOperation("根据课程id查询课程信息")
    @GetMapping("getCourseInfo/{courseid}")
    public CourseInfoDTO getCourseInfoById(@ApiParam(name = "courseid", value = "课程id", required = true)
                                  @PathVariable String  courseid){
        log.info("【查询课程信息】 查询课程id为"+ courseid +"的信息");
        CourseInfoDTO courseInfoDTO = eduCourseService.findCourseById(courseid);

        return courseInfoDTO;
    }


    /**
     * 3.保存课程信息
     * @param courseInfoDTO
     * @return
     */
    @ApiOperation("保存课程信息")
    @PostMapping
    public ResultVO saveCourse(@ApiParam(name = "CourseInfoDTO", value = "课程信息", required = false)
                               @RequestBody( required = false) CourseInfoDTO courseInfoDTO ) {

        String courseId = eduCourseService.saveCourseInfo(courseInfoDTO);
        HashMap<String, String> map = new HashMap<>();
        map.put("courseId", courseId);

        return ResultVOUtil.success(map);
    }

    /**
     * 2. 根据id删除课程
     * @param id
     * @return
     */
    @ApiOperation("根据id删除课程")
    @DeleteMapping("{id}")
    public ResultVO deleteCourseId(@PathVariable String id) {

        log.info("【删除课程】 删除id为:"+id+"的课程");
        if( eduCourseService.removeCourseId(id) ){
            return ResultVOUtil.success();
        }else{
            return ResultVOUtil.error( ResultEnum.ERROR);

        }
    }

    /**  1 .根据不同的条件进行查新,分页显示 。*/
    @ApiOperation(value = "分页讲师列表")
    @PostMapping("{page}/{limit}")
    public ResultVO pageList(
            @ApiParam(name = "page", value = "当前页码", required = true)
            @PathVariable Long page,
            @ApiParam(name = "limit", value = "每页记录数", required = true)
            @PathVariable Long limit,
            @ApiParam(name = "CourseQuery", value = "查询对象", required = false)
            @RequestBody( required = false) CourseQuery CourseQuery){

                log.info("分页获取课程列表信息");
                //封装page分页对象
                Page<EduCourse> pageParam = new Page<>(page, limit);

                IPage<EduCourse> eduCrouseIPage = eduCourseService.pageQuery(pageParam, CourseQuery);
                HashMap<Object, Object> map = new HashMap<>();
                map.put("total", eduCrouseIPage.getTotal());
                map.put("items", eduCrouseIPage.getRecords());
                return  ResultVOUtil.success(map);
    }
}

## 4.4核心配置文件

```bash

# 服务端口
server.port=8077
# 服务名
spring.application.name=edu-gdpuxjl
# 环境设置:dev、test、prod
spring.profiles.active=dev
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/online?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

#热加载生效  true为生效,fals为关闭
spring.devtools.restart.enabled=false


# HikariSpring Boot 2.0之后默认整合的数据库连接池,比druid更快的数据库连接池
# 数据源类型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 连接池名称,默认HikariPool-1
spring.datasource.hikari.pool-name=GuliHikariPool
# 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
spring.datasource.hikari.maximum-pool-size=12
# 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
spring.datasource.hikari.connection-timeout=60000
# 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
spring.datasource.hikari.minimum-idle=10
# 空闲连接超时时间,默认值60000010分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
# 只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
spring.datasource.hikari.idle-timeout=500000
# 连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
spring.datasource.hikari.max-lifetime=540000
#连接测试查询
spring.datasource.hikari.connection-test-query=SELECT 1
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


spring.jackson.date-format= yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone= GMT+8



spring.jackson.default-property-inclusion=non_null

#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/online/edu/gdpuxjl/mapper/xml/*.xml

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值