在线教育项目第一次课-搭建后端框架

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: 新版在线教育项目 标签: 在线教育

2024-03-22 18:44:50 1142浏览

在线教育项目后端搭建——多模块

效果展示

讲师部分

课程分类

课程管理和发布课程

发布课程的时候,先添加章节,后添加小节




点击最终发布课程,就把课程的状态字段变成发布状态。

视频预览

要这种弹出阿里云播放器的效果

统计分析模块

前台首页

前台课程详情

前台讲师详情

前台视频播放

前台用户登录

前台用户注册

购买课程

微信扫码支付

项目开发安排

补充点:前台 前端 后台 后端

表设计

  • edu_acl_permission资源表(菜单)
  • edu_acl_role角色表
  • edu_acl_role_permission角色资源中间表
  • edu_acl_user后台用户
  • edu_acl_user_role后台用户和角色中间表
  • edu_banner轮播图表
  • edu_chapter课程章节表
  • edu_comment评论表
  • edu_course课程表
  • edu_course_collect课程收藏表
  • edu_course_description课程描述表
  • edu_member前台用户表(会员表)
  • edu_order订单表
  • edu_pay_log支付记录表
  • edu_statistics_daily统计表
  • edu_subject课程分类表
  • edu_teacher讲师表
  • edu_video小节表(含视频字段)

后端搭建

多模块思想

要求必须是多模块的架构(为将来学习分布式做准备)

集成swagger3

依赖

<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
     <version>4.1.0</version>
</dependency>

application.yml配置

# 在线文档配置
springdoc:
  swagger-ui:
    # 配置swagger-ui界面访问路径
    path: /swagger-ui.html
    # 包扫描路径 换成你的control层
  packages-to-scan: com.pjx.sys.controller
  # 默认开启wend
  api-docs:
    enabled: true

swagger3配置类

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class SwaggerConfig {
 
    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("杰凡在线教育")
                        //描叙
                        .description("我的API文档")
                        //版本
                        .version("v1")
                        //作者信息,自行设置
                        .contact(new Contact().name("王").email("1913284695@qq.com").url("https://www.jf3q.com"))
                        //设置接口文档的许可证信息
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")));
    }
 
}

常用的注解@Tag

controller 层

import com.example.test.pojo.Books;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@Tag(name = "测试",description = "描述")
@RestController
@RequestMapping("/getBooks")
public class BookController {
 
    @GetMapping
    @Operation(summary = "测试接口")
    public Books getBooks(){
        Books books = new Books();
        books.setId(1);
        return books;
    }
}

实体类层

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
 
@Schema
@Data
public class Books {
    @Schema(name = "id",description = "用户id",defaultValue = "12",example = "1")
    private Integer id;
}

测试

localhost:端口/doc.html

image.png

切记:如果你集成了security等权限框架的时候,要在白名单放行

@Override
public void customize(WebSecurity web) {
    web.ignoring().requestMatchers("/v3/**","/webjars/**","/doc.html", "/swagger-ui/**", "/v3/api-docs/**","/login","/swagger-ui.html");
}

全局异常

@RestControllerAdvice
public class GlobalException {

    @ExceptionHandler(RuntimeException.class)
    public ResultVo exception(RuntimeException e){
        return ResultVo.error(e.getMessage());
    }
}

自动填充创建时间和修改时间


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //属性名称,不是字段名称
        this.setFieldValByName("eduCreate", new Date(), metaObject);
        this.setFieldValByName("eduModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("eduModified", new Date(), metaObject);
    }
}
 /**
     * 创建时间
     */
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private Date eduCreate;

    /**
     * 更新时间
     */
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date eduModified;

逻辑删除

区分物理删除和逻辑删除的区别,逻辑删除是假删除,只是把is_del这种字段从0变成1,因为数据是无价的,实际企业大部分用的都是逻辑删除。

具体做法,就是在实体类上加注解;

@TableLogic(value = "0",delval = "1")
private int isDel;

解释一下:

  • value = “未删除的值,默认值为0”;若设置为2,则查询时 where 后面自动拼接 is_del = 2
  • delval = “删除后的值,默认值为1”

从此执行删除方法的时候就变成了假删除,也就是逻辑删除。

另外需要注意的是MyBatis Plus 做所有查询操作时,自动会在 where 条件后面拼上 is_del = 0,所以 is_del 置一后,实现了逻辑删除

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695