在线学习平台-班级模块

news2025/1/19 11:33:21

在线学习平台-项目搭建

在线学习平台-需求分析

若依的基本使用

通过分析可知,班级模块的结构会比较简单,可以先从班级模块入手

1.先在domain里写上班级里的属性

        快捷方式:

时区可以这里找,时区和数据库名之间要加一个 '?'

右键需要的数据库模型,便可直接生成

生成的实体类不需要get、set方法,可以全部删掉,然后在类上面加上注解@data

数据类型要改成包装类

再配置好MyBatisPlus的一套流程:

       第一步:

        先在mapper新建一个接口:____Mapper,继承BaseMapper<里面放上对应的实体类模型>

       第二步:

        在service层建一个接口:I___Service,继承IService<里面放上对应的实体类模型>

       第三步

        在service层下面建一个实现类的包:Impl

                在impl包下建一个实现I___Service的类 ___ServiceImpl,继承ServiceImpl<mapper,class>

                控制层需要调用这个地方,要用@service注入.

到此为止,就可以在控制层实现对类 基本的增删改查功能

将登入接口写入swagger

将验证码接口写入swagger

关于数据的返回类型:

        

        com.ruoyi.common.core.domain.R;
        com.ruoyi.common.core.page.TableDateinfo; (分页)

可以借用上面两个封装好的实体类返回

                

班级分析

班级除了一些常规字段,还需要备注、名称、班级id、同时还需要支持分页查询

代码编写

在控制层注入Service的内容

    @Autowired
    private IMsClassService msClassService;

想要实现分类操作,可以用msClassService里的page方法,

page方法需要传入page对象,

page对象需要传入分页信息(pageNum,pageSize)

最后会返回一个分页对象Page<实体类名称>

将分页参数封装成实体类

返回值类的选择

BaseController里面封装了一个TableDateinfo类型的方法getDateTable,需要传入一个list集合

但如果使用swagger,这个方法会用不了(swagger无法识别带有问好的参数)

此时启动会出现mapper层找不到的情况

因为这是我们自己写的增强模块,命名没有符号若依设定好的规则,需要自己配置扫描路径

配置扫描

通过全局搜索,寻找com.ruo.*

加上自己的模块,才能扫描出来

启动后,因为rows里面的参数是?,swagger识别不出来,需要外面自己写一个类来返回

返回值类

在自己的模块建一个core包(放一些通用的包),里面再建一个TableDate(用于返回分类数据的实体类)

里面的rows<T>要用泛型来传,swagger才能接收到,里面再生成它的构造器,和一些通用的方法

package com.mashang.elearing.core;

/*
统一返回实体类
 */

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

@ApiModel("分页数据")
@Data
public class TableData<T> {

    @ApiModelProperty("状态码")
    private Integer code;

    @ApiModelProperty("提示消息")
    private String msg;

    @ApiModelProperty("数据")
    private List<T> rows;

    @ApiModelProperty("总数量")
    private Long total;

    public TableData(Integer code, String msg, List<T> rows, Long total) {
        this.code = code;
        this.msg = msg;
        this.rows = rows;
        this.total = total;
    }

    public static TableData success(List list, Long total){
        return new TableData(200,"操作成功",list,total);
    }

}

版本问题

这个时候可能会出现sql语法问题,这种情况是plus的版本有问题

可以在common模块更改成3.5.1

实现班级模糊查询

在page方法里,除了可以传pageNum,和pageSize还可以传条件构造器 lamdaQueryWrapper

qw.like()方法,要支持不传入班级名称时不执行该方法,调用

LambdaQueryWrapper<MsClass> qw = new LambdaQueryWrapper();

        //模糊查询,没传参数的时候不执行
        qw.like(StringUtils.isNotEmpty(className),MsClass::getClassName,className);

来判断

配置日志:

在用swagger调试时,没有日志信息,不方便排查错误

可以在ruoyi-admin/logback.xml,加上我们自己的模块

mapstruct转化

此时查询出来的数据,并不是所有的数据(如updatetime之类的)都需要返回给前端,需要借助mapstruct依赖进行转化

mapstruct有个缺点,经常需要清缓存才能正常使用

在自己的模块移入依赖mapstruct

<dependency>
      <groupId>org.mapstruct</groupId>
      <artifactId>mapstruct</artifactId>
      <version>1.4.2.Final</version>
    </dependency>
    <dependency>
      <groupId>org.mapstruct</groupId>
      <artifactId>mapstruct-processor</artifactId>
      <version>1.4.2.Final</version>
    </dependency>

提取需要的字段

需求里只需要classId、className和remake,此时可以在domain下面搞一个Vo包来映射

package com.mashang.elearing.domain.vo; 在这个位置建MsClassPageVo
package com.mashang.elearing.domain.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("班级分页模型")
public class MsClassPageVo {

    @ApiModelProperty("班级主键")
    private  Long classId;

    @ApiModelProperty("班级名称")
    private String className;

    @ApiModelProperty("备注")
    private String remark;

}
具体操作

分页对象和条件构造器查询出来的都是msclass,需要在最后转成MsclassPageVo来返回

建一个mapping包,包下面放接口,命名为MsClassMapper

查询接口的最终代码

@ApiOperation("分页查询")
    @GetMapping("/list")
    public TableData<MsClassPageVo> test(String className, Pager pager){

        //条件构造器,这里的实体类是MsClass,不是MsClassPageVo
        LambdaQueryWrapper<MsClass> qw = new LambdaQueryWrapper();

        //模糊查询,没传参数的时候不执行
        qw.like(StringUtils.isNotEmpty(className),MsClass::getClassName,className);
        qw.ne(MsClass::getDelFlag,"2");//假删后的内容不需要查出来
        //按降序来显示,最近添加的放在最上面
        qw.orderByDesc(MsClass::getCreateTime);

        //page对象,这里的实体类是MsClass,不是MsClassPageVo
        Page<MsClass> page =  msClassService.page(
                new Page<>(pager.getPageNum(),pager.getPageSize()),qw);

        //这个时候再把MsClass转成MsClassPageVo
        List<MsClassPageVo> vos = MsClassMapping.INSTANCE.to(page.getRecords());

        return TableData.success(vos,page.getTotal());

    }
查询接口样例

添加接口

        所需参数

        添加时,只需要传classId、className和remake就行,其他不用。

        如果直接用实体类MsClass传,前端会得到很多数据,可能会误导前端。

        跟前面的查询一样,在domain单独搞一个包params,里面放前端需要的 实体类传入,然后再转成MsClass。剩下那些创建者、创建时间之类的字段可以后端统一自动填充

package com.mashang.elearing.domain.params.clazz;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;

@ApiModel("添加模型")
@Data
public class MsClassCreate {

    @ApiModelProperty(value = "班级名称",required = true)
    @NotBlank(message = "班级名称不能为空")
    private String className;

    @ApiModelProperty("备注")
    private String remark;

}
        在mapping里面转
MsClass to(MsClassCreate create);
       统一返回实体类

        添加的返回值是boolean,为了适配,也能够返回一些信息,可以自己在core那里搞一个返回的实体类

package com.mashang.elearing.core;

import io.swagger.annotations.ApiModel;
import lombok.Data;

@ApiModel("操作响应对象")
@Data
public class Result<T> {

    private Integer code;

    private String msg;

    private T data;

    public Result(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static Result success(Object data){
        return new Result(200,"操作成功",data);
    }

    public static Result success(){
        return new Result(200,"操作成功",null);
    }

    public static Result error(){
        return new Result(500,"操作失败",null);
    }

    public static Result error(String msg){
        return new Result(500,msg,null);
    }

    public static Result to(boolean rs){
        return rs ? success() : error();
    }
    public static Result to(int rs){
        return rs > 0? success() : error();
    }
}

操作完后只需要知道成功与失败,不需要返回具体信息

        自动填充类

        创建一个handle包,里面创建FiledHanlder(用来自动填充不需要传的字段)

        createBy和updateBy是用户的账号

package com.mashang.elearing.handler;

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

import java.util.Date;

@Component
public class FieldHandler implements MetaObjectHandler {
    /**
     * 插入时的填充策略
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("createBy", SecurityUtils.getUsername(),metaObject);
        this.setFieldValByName("updateBy", SecurityUtils.getUsername(),metaObject);
    }

    /**
     * 更新时的填充策略
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", SecurityUtils.getUsername(),metaObject);
    }

}

然后在实体类上加上注解,以后这些字段有需要的话就自动填充

        在MsClass添加自动填充
package com.mashang.elearing.domain;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.util.Date;

@Data
public class MsClass {

  @TableId(type = IdType.AUTO)
  private Long classId;
  private String className;


  private String delFlag;

  @TableField(fill = FieldFill.INSERT)
  private String createBy;

  @TableField(fill = FieldFill.INSERT)
  private Date createTime;

  @TableField(fill = FieldFill.INSERT_UPDATE)
  private String updateBy;

  @TableField(fill = FieldFill.INSERT_UPDATE)
  private Date updateTime;

  private String remark;

}

一些小规范

        导入swagger参数验证的依赖@Validated,防止一些空值传入

<dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.2.3.Final</version>
      <scope>compile</scope>
    </dependency>

@Notblank:不能为空也不能为空字符串

  添加接口的最终代码

    @ApiOperation("添加")
    @PostMapping
//    @RequestBody以json的格式传
    public Result create(@RequestBody @Validated MsClassCreate create){

        MsClass msClass = MsClassMapping.INSTANCE.to(create);
//        msClass.setCreateTime(new Date());
//        msClass.setCreateBy(getUsername());   //有自动填充就不需要自习设置
        return Result.to(msClassService.save(msClass));
    }

修改接口

参照添加接口,更改参数,在mapping里转化。updateById传入的MsClass对象,但是msclass里的内容不是都需要给前端的,所以需要转化将MsClassDtlVo转成MsClass

        第一步:

        在domain的params包下创建需要的实体类MsClassDtlVo

package com.mashang.elearing.domain.params.clazz;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@ApiModel("班级修改模型")
@Data
public class MsClassUpdate {


    @NotNull(message = "班级id不能为空")
    private Long classId;

    @ApiModelProperty(value = "班级名称",required = true)
    @NotBlank(message = "班级名称不能为空")
    private String className;

    @ApiModelProperty("备注")
    private String remark;

}

        修改,classId和班级名称都是必传,要用@Validated验证

        第二步:

        跟之前一样,需要在mapping里面转

        修改接口需要的是MsClass,将传入的MsClassUpdate转成MsClass

MsClass to(MsClassUpdate update);
        最后代码
@ApiOperation("修改")
    @PutMapping
    //@RequestBody以json的格式传
    public Result update(@RequestBody @Validated MsClassUpdate update){

        MsClass msClass = MsClassMapping.INSTANCE.to(update);

        return Result.to(msClassService.updateById(msClass));
    }

   要再写查询接口,每次点击修改,要把之前的信息查出来

查询详情接口

package com.mashang.elearing.domain.vo;

import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@ApiModel("班级详情模型")
@Data
public class MsClassDtlVo {

    @ApiModelProperty("班级主键")
    private  Long classId;

    @ApiModelProperty("班级名称")
    private String className;

    @ApiModelProperty("备注")
    private String remark;
}
   第一步

  查询出来的是MsClass对象,然后把再把它转成MsClassDtlVo

   第二步

   在domain的Vo创建MsClassDtlVo

package com.mashang.elearing.domain.vo;

import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@ApiModel("班级详情模型")
@Data
public class MsClassDtlVo {

    @ApiModelProperty("班级主键")
    private  Long classId;

    @ApiModelProperty("班级名称")
    private String className;

    @ApiModelProperty("备注")
    private String remark;
}
        第三步

       在mapping里的MsClassMapping加上下面这段代码

MsClassDtlVo to(MsClass msClass);
       TableId

        ById结尾的方法默认用Id属性,如果命名不是id的话,需要去实体类配置

查询详情接口代码
 @ApiOperation("查询详情")
    @GetMapping("/{id}")
    //@RequestBody以json的格式传
    //@PathVariable 把参数放在路径上
    public Result<MsClassDtlVo> getById(@PathVariable Long id){
        //getById  查出来的是Msclass对象,其中不是所有数据都需要返回,可以转成前端需要展现的内容
        //getById返回值是MsClass类型,需要转成MsClassDtlVo
        MsClassDtlVo dtlVo = MsClassMapping.INSTANCE.to(msClassService.getById(id));
        return Result.success(dtlVo);
    }

删除接口

        删除接口用的是假删,不是调用removeById,而是用updateById,传入MsClass对象

        把MsClass对象的DelFlag 设置成2

        只需要返回成功与失败,不需要返回删除了什么内容

 @ApiOperation("删除")
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Long id){
        MsClass msClass = new MsClass();
        msClass.setClassId(id);
        msClass.setDelFlag("2");
        return Result.to(msClassService.updateById(msClass));
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能优化算法应用:基于蛇优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蛇优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蛇优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蛇优化算法4.实验参数设定5.算法结果6.参考文献7.…

服务器配置免密SSH

在当今互联网时代&#xff0c;远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室&#xff0c;安全始终是首要考虑的因素。这就是为什么 SSH&#xff08;Secure Shell&#xff09;成为了网络专业人士的首选工具…

Python---类的综合案例

1、需求分析 设计一个Game类 属性&#xff1a; 定义一个类属性top_score记录游戏的历史最高分 定义一个实例属性player_name记录当前游戏的玩家姓名 方法&#xff1a; 静态方法show_help显示游戏帮助信息 类方法show_top_score显示历史最高分 实例方法start_game开始当前…

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

JS的变量提升ES6基础

JS的变量提升&ES6基础 变量var关键字var声明作用域实例一实例二多个变量 变量提升 let关键字暂时性死区全局声明for循环中使用let const关键字 变量 ECMAScript变量时松散类型的&#xff0c;意思是变量可以用于保存任何类型的数据。 声明变量&#xff1a;var 、const、let …

NumPy学习:NumPy(Numerical Python)基础(一)

1.什么是NumPy NumPy 是 Python 中用于科学计算的基础包。 它是一个 Python 库&#xff0c;提供多维数组对象&#xff0c; 各种派生对象&#xff08;例如掩码数组和矩阵&#xff09;&#xff0c;以及 用于对阵列进行快速操作的各种例程&#xff0c;包括 数学、逻辑、形状操作、…

AI助力智慧农业,基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

视觉资料记录

1. 江南才尽&#xff0c;年少无知&#xff01;_RK3399移植,(02)Cartographer源码无死角解析-免费,(01)ORB-SLAM2源码无死角解析-免费-CSDN博客江南才尽&#xff0c;年少无知&#xff01;擅长RK3399移植,(02)Cartographer源码无死角解析-免费,(01)ORB-SLAM2源码无死角解析-免费,…

HCIP考试实验

实验更新中&#xff0c;部分配置解析与分析正在完善中........... 实验拓扑图 实验要求 要求 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3…

java之“输入与输出”程序详解

java之“输入与输出”程序详解 一、eclipse操作示例1、完整代码2、运行效果3、代码与运行结果关系图 一、eclipse操作示例 1、完整代码 import java.util.Scanner;public class inputOutput {/*** param args 输入与输出*/public static void main(String[] args) {// 输出Sy…

Rsync+Sersync

服务器相关参数 源服务器 192.168.17.101 目标服务器&#xff08;同步到的服务器&#xff09; 192.168.17.103 ##目标服务器配置 ###1、配置rsync服务 1、安装rsync yum -y install rsync 2、配置rsync vim /etc/rsyncd.conf 配置文件内容 uid root gid root use c…

【数据结构】C语言结构体详解

目录 前言 一、结构体的定义 二、定义结构体变量 三、结构体变量的初始化 四、使用typedef声明新数据类型名 五、指向结构体变量的指针 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1…

接口测试要测试什么?

第一部分&#xff1a; 首先&#xff0c;在做接口测试的过程中&#xff0c;经常有后端开发会问&#xff1a; 后端接口都测试什么&#xff1f;怎么测的&#xff1f;后端接口测试一遍 &#xff0c;前端也测试一遍&#xff0c;是不是重复测试了&#xff1f; 于是&#xff0c;为了…

2023年5个自动化EDA库推荐

EDA或探索性数据分析是一项耗时的工作&#xff0c;但是由于EDA是不可避免的&#xff0c;所以Python出现了很多自动化库来减少执行分析所需的时间。EDA的主要目标不是制作花哨的图形或创建彩色的图形&#xff0c;而是获得对数据集的理解&#xff0c;并获得对变量之间的分布和相关…

Apache Kafka CVE-2023-25194(metasploit版)

Step1&#xff1a;用docker搭建环境 Step2&#xff1a;docker查看映射端口 Step3&#xff1a;访问特定端口&#xff0c;然后靶标应用。 Step4&#xff1a;用metasploit进行攻击&#xff1a; 首先&#xff0c;打开metasploit&#xff0c;然后查询需要攻击的板块&#xff0…

对Spring源码的学习:一

目录 BeanFactory开发流程 ApplicationContext BeanFactory与ApplicationContext对比 基于XML方式的Bean的配置 自动装配 BeanFactory开发流程 这里的第三方指的是Spring提供的BeanFactory&#xff0c;Spring启动时会初始化BeanFactory&#xff0c;然后读取配置清单&#…

元宇宙:重塑游戏行业体验下一个前沿

游戏行业在其整个历史中经历了显著的转变&#xff0c;从超级马里奥的像素化冒险发展到Red Dead Redemption等游戏中迷人的开放世界体验。随着时间的推移&#xff0c;游戏不断突破数字领域所能达到的极限。然而&#xff0c;被称为元宇宙的突破性演变将彻底改变游戏行业&#xff…

【复杂gRPC之Java调用go】

1 注意点 一般上来说如果java调用java的话&#xff0c;我们可以使用springcloud来做&#xff0c;而面对这种跨语言的情况下&#xff0c;gRPC就展现出了他的优势。 代码放在这了&#xff0c;请结合前面的go服务器端一起使用 https://gitee.com/guo-zonghao/java-client-grpc /…

2-4、DEBUG和源程序区别

语雀原文链接 文章目录 1、DEBUG 和 汇编编译器MASM区别1&#xff1a;默认进制不同区别2&#xff1a;[地址]示例1&#xff1a;debug示例2&#xff1a;[0]示例3&#xff1a;[寄存器]示例4&#xff1a;ds:[0]小结 区别3&#xff1a;源程序数据不能以字母开头 1、DEBUG 和 汇编编…

labelme等标注工具/数据增强工具输出JSON文件格式检查脚本

标注的文件太多了&#xff0c;还有用数据增强工具生成了一票的新数据。在转换或使用训练时候会报错&#xff0c;错误原因是json中语法有问题&#xff0c;这样会中断程序运行&#xff0c;调试造成很大困扰。 检查确实最后有问题&#xff0c;多写了一次 写一个脚本&#xff0c;用…