在线学习平台-课程分页、用户管理、教师查询

news2024/12/24 2:50:18

在线学习平台------手把手教程👈

用户管理

添加功能增强

新增属性

若依里的用户模块(SysUser)是没有课程这一属性的,要实现我们自己的课程分页查询功能

62c4785bd3774f9598c1ce7303c26803.png

这个位置传入的实体类SysUser要加上classId,记得加上get、set方法

更改sql语句

ctrl + 鼠标左键不断点进去,查看调用位置

29af41951f754e299b3e318e26879914.png

78995be3ab30413ea8c5634607b43749.png

b8ca60eab5b34619a35f4360427298d2.png

c2b9ee74a8e64b7582b04ccb5a213f23.png

aeb25cb532554606874218b3315bcb8f.png

加入swagger文档:

package com.ruoyi.web.controller.system.SysUserController加上Api(tags = "用户管理")

在add方法上加ApiOperation("用户添加")

4ccd3270a4ec45d5942827f175a08f16.png

33068b52cc384e8a99a5e4b1add81993.png

 

user_name是账号,nick_name才是昵称

所需参数

e639f3190cc74a098c12462716875e1e.png

563b0f87d0b54c39acce8d505a393b73.png

修改功能增强

ee3255c26a4c46629846eb25b342ba87.png

和添加操作一样,需要在sql语句那边加上classId属性

查询功能

修改之前要写上先写查询功能

a9539e4944d84279a3030e5a65c055cb.png

也和添加操作一样,一直点到sql语句的位置

161eff33e08e41c2bfd3858a2a0ac538.png

26762e3f1408441e9577d130f93f3ad9.png

e2d3da1431144f8a99f0efdd6329b183.png

课程模块:

1b6abd78185046aca88f5ee8febe5439.png

班级名称和教师名称是采用关联的方式得到

7f009c9ccaf54696853a60bb59fd9f4f.png

48b3a7b3a7ec48509d34afe69649e6ca.png

 前期准备:

 

先在domain自动生成实体类MsCourse

用lombok代替get、set方法,数据类型都改成包装类

d9285031208848ff95dc26531751c093.png

设置实体类的自动递增、主键、自动填充

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 com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

@Data
public class MsCourse {

  @TableId(type = IdType.AUTO)
  private Long courseId;


  private String courseName;
  private String courseCover;
  private Long classId;
  private Long teacherId;
  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)
  //设置返回格式
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  private Date updateTime;
  private String remark;




}

分页查询课程

 先在package com.mashang.elearing.domain.vo;生成对应的Vo
package com.mashang.elearing.domain.vo;

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

@ApiModel("查询课程分页")
@Data
public class MsCoursePageVo {

    @ApiModelProperty("课程id")
    private Long courseId;

    @ApiModelProperty("课程名称")
    private String courseName;

    @ApiModelProperty("课程封面")
    private String courseCover;

    @ApiModelProperty("班级id")
    private Long classId;

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

    @ApiModelProperty("教师名称")
    private String teacherName;

    @ApiModelProperty("教师id")
    private Long teacherId;

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

}

因为是关联查询,不能用MyBatis-Plus,只能老实用MyBatis

package com.mashang.elearing.mapper;在这个位置建一个接口MsCourseMapper

在resources下面建一个文件夹(directory)mapper,在mapper下建一个xml-MsCourseMapper,这一个xml里面要绑定上面的MsCourseMapper

c5f1a5637940413ab2f969f58b70082f.png

第一步:

        在package com.mashang.elearing.mapper里继承BaseMapper<MsCourse>,再写一个方法

//分页需要传入page对象和条件构造器对象,两个参数要用@Param区别,
    // 导入的都是mybatis-plus里的对象
    //@Param是导自于ibatis里的
    Page<MsCoursePageVo> page(@Param("page")Page<MsCoursePageVo> page,
                              @Param(Constants.WRAPPER)Wrapper wrapper);

 第二步:

        去对应的xml实现这个方法

 

a8de24d40c784d2fbb38801ff755eb9d.png4f8f570bccca4b2aac57cceecd1f6b8b.png

第三步

        在service层建一个 IMsCourseService 继承 IService<MsCourse>

        在serivce层下的impl包下建一个MsCourseServiceImpl 继承(extends) ServiceImpl<MsCouseMapper,MsCourse> 再 实现自己的 IMsCourseService接口

第四步

        在IMsCourseSerive写上对应的方法

    //Pager里面放了 pageNum,和pageSize,支持通过教师id和名称来搜索
    //教师id是用下拉框来实现的
    //班级名称是用模糊查询来实现的
    Page<MsCoursePageVo> page(Pager pager,Long teacherId,String courseName);

第五步

        去MsCourseServiceImpl去实现这个方法

        记得要注入Mapper层的对象

 @Autowired
    private MsCourseMapper msCourseMapper;


    @Override
    public Page<MsCoursePageVo> page(Pager pager, Long teacherId, String courseName) {

        //拿到page对象
        Page<MsCoursePageVo> p = new Page<>(pager.getPageNum(),pager.getPageSize());

        //拿到构造器对象,这里只能用普通的QueryWrapper
        //关联查询不能使用lamdaQueryWrapper
        QueryWrapper<MsCoursePageVo> qw = new QueryWrapper<>();
        qw.ne("t1.del_flag",2);
        qw.eq(teacherId != null,"t1.teacher_id",teacherId);
        qw.like(StringUtils.isNotEmpty(courseName),"t1.course_name",courseName);
        qw.orderByDesc("t1.create_time");

        //page方法需要一个page对象和条件构造器对象
        return msCourseMapper.page(p,qw);
    }

        按降序排列,把新增二点放在最前面

第六步:

        创建控制层MsCourseController,控制层上记得写上@Api和@ApiOperation

        固定写法@RestController和@RequestMapping("/course")记得写上

        然后注入的是IMsCourseService

 //这里注入的是Service层的那个接口
    @Autowired
    private IMSCourseService msCourseService;

    @ApiOperation("分页查询")
    @GetMapping("/list")
    //TableData是用来返回分页数据的
    //@Validated参数验证,分页页码和条数必填
    public TableData<MsCoursePageVo> page(@Validated Pager pager, Long teacherId, String courseName){

        //msCourseService.page返回的是一个分页的Page对象
        Page<MsCoursePageVo> page = msCourseService.page(pager, teacherId, courseName);

        //注意这里返回的是集合
        List<MsCoursePageVo> records = page.getRecords();
        long total = page.getTotal();
        return TableData.success(records,total);
    }

9db414da834644dfb061d0b77d425ef3.png002ac0340c894f9885f36dd33bb190e1.png

 添加接口

5efccbc7286f4e53a2348c9b571c7d84.png

课程需要courseCover、courseName、classId、teacherId(下拉框)

设置要添加的的参数实体类

在params包下创建添加的实体类

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

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 MsCourseCreate {

    //课程Id可以在设置自动递增,courseId不用填

    @ApiModelProperty(value = "课程名称",required = true)   //这里的required只是建议
    @NotBlank(message = "课程名称不能为空")     //这里的NotBlank是必须的
    private String courseName;
        
    //NotBlank一般用于字符串
    //NotNull一般用于 Long

    @ApiModelProperty(value = "课程封面",required = true)
    @NotBlank(message = "封面不能为空")
    private String courseCover;


    @ApiModelProperty(value = "班级id",required = true)
    @NotNull(message = "班级id不能为空")
    private Long classId;


    @ApiModelProperty(value = "教师id",required = true)
    @NotNull(message = "教师id不能为null")
    private Long teacherId;


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

}

添加调用的是save方法,传入的是MsCourse,需要将MsCourseCreate转成MsCourse

传参转化

在com.mashang.elearing.mapping包下建一个接口MsCourseMapping
MsCourseMapping INSTANCE = Mappers.getMapper(MsCourseMapping.class);


    List<MsClassPageVo> to(List<MsClass> msClasses);

代码

@ApiOperation("课程添加")
    @PostMapping
    public Result create(@RequestBody @Validated MsCourseCreate courseCreate){

        MsCourse msCourse = MsCourseMapping.INSTANCE.to(courseCreate);

        return Result.to(msCourseService.save(msCourse));
    }

修改接口

e45bd0c4f4ab4b638594de0ce3262cf0.png

修改相较于添加,要多传入一个课程Id,courseId为主键

        设置要修改的参数实体类

        赋值添加接口的传参,在com.mashang.elearing.domain.params.course这个这个位置创建一个

MsCourseUpdate实体类,加上课程Id,其他和添加接口一致

        传参转化

        MsCourse to(MsCourseUpdate update);

        代码

@ApiOperation("课程修改")
    @PutMapping
    //Json的形式传、并且需要参数验证
    public Result update(@RequestBody @Validated MsCourseUpdate update){

        MsCourse msCourse = MsCourseMapping.INSTANCE.to(update);

        return Result.to(msCourseService.updateById(msCourse));
    }

删除接口 

删除采用的是假山,调用的是UpdateById

@ApiOperation("课程删除")
    @DeleteMapping("/{courseId}")
    //    @PathVariable参数放在路径上
    public Result delete(@PathVariable Long courseId){

        MsCourse msCourse = new MsCourse();
        msCourse.setCourseId(courseId);
        msCourse.setDelFlag("2");

        return Result.to(msCourseService.updateById(msCourse));
    }

查询详情接口

创建Vo

在com.mashang.elearing.domain.vo创建对应的Vo

package com.mashang.elearing.domain.vo;

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


@ApiModel("查询课程详情")
@Data
public class MsCourseDtlVo {

  //这里不能只返回班级id和教师id,对应的名称也要用关联查询查出来

  @ApiModelProperty("课程id")
  private Long courseId;

  @ApiModelProperty("课程名称")
  private String courseName;

  @ApiModelProperty("课程封面")
  private String courseCover;

  @ApiModelProperty("班级id")
  private Long classId;

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

  @ApiModelProperty("教师名称")
  private String teacherName;

  @ApiModelProperty("教师id")
  private Long teacherId;

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

}

写sql语句

教师名称和班级名称要用关联查询把他们查出来 

之前在courseMapper的xml写过一样的查询语句,可以将之前的语句抽取出来公用

ea3f6a05f04d4a908716be93ccc030b8.png

mapper层

在MsCourseMapper里加上方法

8f0823b4552b4d8eb3cfdd23544d3631.png

写上对应的sql语句,查询课程详情和查询课程列表的返回值一样,但最好要单独分开

返回的时候不需要转,sql语句的resultmap已经是我们需要的内容了

xml实现

<resultMap id="getDtlByIdMap" type="msCourseDtlVo">
        <id property="courseId" column="course_id"></id>
        <result property="courseName" column="course_name"></result>
        <result property="courseCover" column="course_cover"></result>
        <result property="classId" column="class_id"></result>
        <result property="teacherId" column="teacher_id"></result>
        <result property="className" column="class_name"></result>
        <result property="teacherName" column="nick_name"></result>
        <result property="remark" column="remark"></result>
    </resultMap>
    <select id="getDtlById" resultMap="getDtlByIdMap">
        <include refid="listVo"></include>
        where t1.course_id = #{courseId}
    </select>
<sql id ="listVo">
        SELECT
            t1.course_id,
            t1.course_name,
            t1.course_cover,
            t1.class_id,
            t1.teacher_id,
            t2.class_name,
            t3.nick_name,
            t1.remark
        FROM
            ms_course AS t1
            LEFT JOIN ms_class AS t2 ON t1.class_id = t2.class_id
--             AND t2.class_id = t1.course_id
            LEFT JOIN sys_user AS t3 ON t3.user_id = t1.teacher_id
    </sql>

service层

同时在IMsCourseService加上对应的方法,然后实现它

7f2ad38a15b94e0e98ef664ebc68afdb.png

fa0cc27639ae4b04a4ba33cb0d2c6610.png

最终代码代码

  @ApiOperation("查询详情")
    @GetMapping("/{courseId}")
    //    @PathVariable参数放在路径上
    public Result<MsCourseDtlVo> getById(@PathVariable Long courseId){

        //这个位置不需要转,直接返回就行
        return Result.success(msCourseService.getDtlById(courseId));
    }

查询教师列表

sql1

得到每个教师对应的信息

6444943ecf424caa95d6410ffc31c9c3.pngwhere后面这样写健壮性低,(如果删除了一个教师,又填了一个,role_id就变成了4)可以用一个专门的标识teacher来过滤

sql2

9dcf2f92c8de4057a710c267a8dfacce.png

t1和t2关联得到每个用户的身份id,再用这个身份id去关联角色表,找出对应标识为teacher的数据

如果删除了一个教师,再新增,那么新的role_id虽然为4,但角色的唯一标识依然是teacher

c949c1ddf91f4271bb66097e5e670552.png

5c902c03ab66405ea9e9622c3477b37b.png

这两张表可以得到role_id

faab58318ac74bbd982c48b38a70547d.png

再用这个role_id,就可以得到role_key

上面的sql语句只需要user_id和nick_name就可以了

093a1bf30dbf4facb22576ffd2a8efb1.png

根据唯一标识(role_key获取对应用户信息)

实体类

在对应位置com.ruoyi.system.domain.vo创建实体类

(这个功能是系统模块的)

1bfede90a9994339bd15f9e1f18f5ab2.png

在mapper层写上对应方法去实现

55d4c11423144d01bb089936361acce7.png

<resultMap id="selectUsersByRoleKeyMap" type="roleUserVo">
		<id property="userId" column="user_id"></id>
		<result property="nickName" column="nick_name"></result>
	</resultMap>
	<select id="selectUsersByRoleKey" resultMap="selectUsersByRoleKeyMap">
		SELECT
			t1.user_id,
			t1.nick_name
			from sys_user t1
			left join sys_user_role t2
			on t1.user_id = t2.user_id
			LEFT JOIN sys_role t3
		on t3.role_id = t2.role_id
		WHERE t3.role_key = #{RoleKey}
		And t1.del_flag != '2'

	</select>

service层

696c994971a540719605f6ba6f4203c4.png

26532fd892924754bc14935ef43ac3f3.png

controller

控制层的调用在ruoyi-admin的SysUserController里

1de8bf82debf487ebb0ad49dcca3618b.png

@ApiOperation(value = "根据roleKey获取用户",notes = "teacher代表教师")
    @GetMapping("/users/{roleKey}")
    public AjaxResult getUsersByRoleKey(@PathVariable String roleKey){
        return success(userService.selectUsersByRoleKey(roleKey));
    }

 

 

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

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

相关文章

3D摄影棚布光:Set A Light 3D Studio

Set A Light 3D Studio是一款专业的灯光模拟软件&#xff0c;旨在帮助摄影师和电影制片人在电脑上进行虚拟灯光布置和场景模拟&#xff0c;以实现更加精准和高质量的拍摄效果。该软件提供了丰富的灯光和场景模型&#xff0c;支持灵活调整光源位置、强度、颜色和效果等参数&…

php之jwt使用

PHP JWT&#xff08;JSON Web Token&#xff09;是一种用于身份验证和授权的开放标准。JWT是一个包含有关用户或实体身份信息的安全令牌&#xff0c;它由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09;和签名&#xff08;Sig…

j1冒个泡-排序的演变--扩展题

100 哥随机数 。从小到大排序 #include <stdio.h> #include <time.h> #include <stdlib.h> #define NUM 100 void bbule(int *arr,int size){for (int i 0; i < size-1; i)// 运行O(n)次{/* code */for (int j 0; j < size-1-i; j)// 要减i哟{/* co…

浅谈 USB Bulk 深入浅出 (1) - USB 传输模式 及 何谓 USB bulk

来源&#xff1a;大大通【阿福的随笔】浅谈 USB Bulk 深入浅出 (1) - USB 传输模式 及 何谓 USB bulk 1. USB 传输模式有哪些 USB 是即插即用使用差动信号的装置界面&#xff0c;是以 端点 ( Endpoint )&#xff0c;做为传输装置的输出入端&#xff0c;透过不同的端点 ( Endp…

实现React18加TS,解决通用后台管理系统,实战方案落地有效实践经验

随着前端技术的不断发展和更新&#xff0c;使用React 18结合TypeScript&#xff08;TS&#xff09;来构建通用后台管理系统已成为一种常见的选择。本文将介绍如何在项目中应用React 18和TS&#xff0c;并分享一些实战方案的有效实践经验。 一、搭建React 18 TS项目 首先&…

科技提升安全,基于YOLOv5系列模型【n/s/m/l/x】开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题&#xff0c;随着AI技术的快速发展与不断普及&#xff0c;越来越多的商超、地铁等场景开始加装专用的安全检测预警系统&#xff0c;核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…

开箱即用的C++决策树简单实现

一个数据结构期末作业&#xff08;有兴趣用的话可以高抬贵手star下⭐~&#xff09;GitHub - mcxiaoxiao/c-Decision-tree: 决策树c简单实现 &#x1f333; c-Decision-tree 附大作业/课设参考文档.doc &#x1f333; c-Decision-tree Introduction &#x1f64c; c-Decision…

spider小案例~https://industry.cfi.cn/BCA0A4127A4128A4141.html

一、获取列表页信息 通过抓包发现列表页信息非正常返回&#xff0c;列表信息如下图&#xff1a; 通过观察发现列表页信息是通过unes函数进行处理的&#xff0c;我们接下来去看下该函数 该函数是对列表页的信息先全局替换"~"为"%u"&#xff0c;然后再通过…

中伟视界:煤矿行业借力人工智能,防控灾害风险迈出新步伐 《“十四五”矿山安全生产规划》(应急(2022)64号),煤矿重大灾害风险防控系统

随着煤矿行业的发展&#xff0c;煤矿重大灾害风险防控成为了行业关注的重点之一。为了更好地预防和应对灾害风险&#xff0c;煤矿行业开始引入人工智能分析算法和检测场景&#xff0c;以提高灾害风险的识别和预警能力。 在煤矿的重大灾害风险防控中&#xff0c;AI算法发挥着重要…

【Regulatory Genomics】Part3 GENOMICS AT NVIDIA、ATACWORKS

文章目录 Enchancing epigenomic data with deep learningAtacWorks: Improving the quality of ATAC-seq signals1 model structure2 training strategy Performance of AtacWorks 来自Manolis Kellis教授&#xff08;MIT计算生物学主任&#xff09;的课 油管链接&#xff1a;…

MyBatis:缓存

MyBatis 缓存一级缓存二级缓存注 缓存 缓存&#xff0c;是数据交换的缓冲区&#xff08;临时保存数据的地方&#xff09;。即将数据&#xff08;数据一般为频繁查询且不易改变&#xff09;保存在计算机内存中&#xff0c;下次读取数据时直接从内存中获取&#xff0c;以避免频繁…

YOLOv8独家原创改进:轻量化自研设计双卷积,重新设计backbone和neck结构,完成涨点且计算量和参数量显著下降

💡💡💡本文自研创新改进:双卷积由组卷积和异构卷积组成,执行 33 和 11 卷积运算代替其他卷积核仅执行 11 卷积,YOLOv8 Conv,从而轻量化YOLOv8,性能如下表,GFLOPs 8.1降低至7.6,参数量6.3MB降低至5.8MB layers parametersGFLOPsMBYOLOv8n16830068188.16.3MByolov8_…

销售技巧培训之如何提升房地产销售技巧

在房地产销售这个竞争激烈的行业中&#xff0c;要想获得成功&#xff0c;不仅需要熟练掌握销售技巧&#xff0c;还需要不断地提升自己的能力。下面&#xff0c;我们将从以下几个方面探讨如何提升房地产销售技巧。 一、了解客户需求 倾听客户&#xff1a;在与客户沟通时&#x…

据房间Id是否存在,判断当前房间是否到期且实时更改颜色

重点代码展示&#xff1a; <template><el-col style"width: 100%;height: 100%;"><el-col :span"20"><el-card class"room_info"><avue-data-icons :option"option"></avue-data-icons></el-…

【截图版本】Linux常用指令详解

———————————————— 版权声明&#xff1a;本文为CSDN博主「小呆瓜历险记」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/m0_58963318/article/details/134713282

亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级

随着企业数字化转型的深入&#xff0c;企业对于协同办公、移动门户、数字运营、智能客服等方面的需求越来越高&#xff0c;数智化正成为催生新动能和新优势的关键力量。数字化的办公平台可以帮助企业实现各类信息、流程的集中化、数字化和智能化管理&#xff0c;为企业管理者提…

【代码随想录】算法训练计划48

dp 1、198. 打家劫舍 题目&#xff1a; 输入&#xff1a;[2,7,9,3,1] 输出&#xff1a;12 偷窃到的最高金额 2 9 1 12 。 思路&#xff1a; 只有两种情况&#xff0c;递推公式就好说了,dp[i]永远都是题意&#xff0c;就是当前偷到的最大金额 func rob(nums []int) int…

HarmonyOS自定义抽奖转盘开发(ArkTS)

介绍 本篇 Codelab 是基于画布组件、显式动画&#xff0c;实现的一个自定义抽奖圆形转盘。包含如下功能&#xff1a; 1. 通过画布组件 Canvas&#xff0c;画出抽奖圆形转盘。 2. 通过显式动画启动抽奖功能。 3. 通过自定义弹窗弹出抽中的奖品。 相关概念 ● Stack组件…

制作一个RISC-V的操作系统五-RISC-V汇编语言编程一

文章目录 RISC-V汇编语言入门汇编语言概念简介 汇编语言语法介绍&#xff08;GNU版本&#xff09; RISC-V汇编语言入门 汇编语言概念简介 高级&#xff1a;可以理解就是更贴近人的理解 低级&#xff1a;可以理解就是更贴近机器的 难移植&#xff1a;汇编指令基本上和机器指令…

线程安全的哈希表ConcurrentHashMap

1. HashTable 不推荐使用&#xff0c;无脑给各种方法加锁 2.ConcurrentHashMap 多线程下推荐使用 锁粒度控制 HashTable直接在方法上加synchronized&#xff0c;相当于对哈希表对象加锁&#xff0c;一个哈希表只有一把锁。多线程环境下&#xff0c;无论线程如何操作哈希表…