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

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

用户管理

添加功能增强

新增属性

若依里的用户模块(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层的对象

 @Autowiredprivate MsCourseMapper msCourseMapper;@Overridepublic Page<MsCoursePageVo> page(Pager pager, Long teacherId, String courseName) {//拿到page对象Page<MsCoursePageVo> p = new Page<>(pager.getPageNum(),pager.getPageSize());//拿到构造器对象,这里只能用普通的QueryWrapper//关联查询不能使用lamdaQueryWrapperQueryWrapper<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层的那个接口@Autowiredprivate 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("课程添加")@PostMappingpublic 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">SELECTt1.course_id,t1.course_name,t1.course_cover,t1.class_id,t1.teacher_id,t2.class_name,t3.nick_name,t1.remarkFROMms_course AS t1LEFT JOIN ms_class AS t2 ON t1.class_id = t2.class_id
--             AND t2.class_id = t1.course_idLEFT 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">SELECTt1.user_id,t1.nick_namefrom sys_user t1left join sys_user_role t2on t1.user_id = t2.user_idLEFT JOIN sys_role t3on t3.role_id = t2.role_idWHERE 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.mzph.cn/news/215283.shtml

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

相关文章

DS二叉排序树之删除

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

蓝桥杯周赛 第 1 场 强者挑战赛 6. 小球碰撞【算法赛】(思维题/最长上升子序列LIS)

题目 https://www.lanqiao.cn/problems/9494/learning/?contest_id153 思路来源 Aging代码 题解 二分时间t&#xff0c;第i个小球对应一个起点pi、终点pit*vi的区间&#xff0c;问题转化为&#xff0c; 选最多的区间&#xff0c;使得不存在区间包含&#xff08;即li<l…

微信小程序过滤器之计算当前时间差

微信小程序过滤器之计算当前时间差 前言一、wxs简介二、使用步骤1.定义2.使用 前言 最近遇到了一个需求&#xff0c;将小程序里面的具体时间2023-12-11 09:41:06转为当前时间差10小时前&#xff0c;这块可以使用js逻辑函数对数据进行处理&#xff0c;但这里我们采用微信小程序…

Error: Failed to resolve vue/compiler-sfc——vite项目启动报错——npm run serve

运行项目时&#xff0c;报错如下&#xff1a; Error: Failed to resolve vue/compiler-sfc 根据报错信息的提示&#xff1a;vue的版本必须大于3.2.25&#xff0c;经过查看package.json文件&#xff0c;可以看到vue的版本为3.2.36&#xff0c;是满足条件的。 因此考虑缓存问题&…

【OPNEGIS】Geoserver原地升级jetty,解决Apache HTTP/2拒绝服务漏洞 (CVE-2023-44487)

Geoserver是我们常用的地图服务器&#xff0c;在开源系统中的应用比较广泛。在实际环境中&#xff0c;我们可能会选用官方的二进制安装包进行部署&#xff0c;这样只要服务器上有java环境就可以运行&#xff0c;方便在现场进行部署。 1.问题来源 这次由于甲方一月一次的漏洞扫…

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

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

Java - Mybatis的缓存机制、集成SpringBoot后缓存相关问题

mybaits提供一级缓存&#xff0c;和二级缓存 一级缓存&#xff08;默认开启&#xff09; 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象&#xff0c;在对象中有一个(内存区域)数据结构&#xff08;HashMap&#xff09;用于存储缓存数据。不同的sqlSe…

STM32F407-14.3.1-01 时基单元

时基单元 可编程高级控制定时器的主要模块是一个 16 位计数器及其相关的自动重载寄存器。计数器可递增计数、递减计数或交替进行递增和递减计数。计数器的时钟可通过预分频器进行分频。 计数器、自动重载寄存器和预分频器寄存器可通过软件进行读写。即使在计数器运行时也可执行…

Python:核心知识点整理大全14-笔记

目录 ​编辑 7.2.2 让用户选择何时退出 parrot.py 7.2.3 使用标志 7.2.4 使用 break 退出循环 cities.py 7.2.5 在循环中使用 continue counting.py 7.2.6 避免无限循环 counting.py 7.3 使用 while 循环来处理列表和字典 7.3.1 在列表之间移动元素 confirmed_user…

数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载 地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键&#xff0c;选择“链接…

【JVM从入门到实战】(二)字节码文件的组成

一、Java虚拟机的组成 二、字节码文件的组成 字节码文件的组成 – 应用场景 字节码文件的组成部分-Magic魔数 什么是魔数&#xff1f; Java字节码文件中的魔数 文件是无法通过文件扩展名来确定文件类型的&#xff0c;文件扩展名可以随意修改&#xff0c;不影响文件的内容。…

UE引擎 LandscapeGrass 实现机制分析(UE5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是植被&#xff0c;目前UE5引擎提供给植被生成的主流两种方式为 手刷植被和LandscapeGrass(WeightMap程序化植被)。当然UE5.3推出新一代PCGFramework 节点程序化生成框…

MyBatis:缓存

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

OpenAI接口调用示例

最近为公司做了一个ChatGPT工具&#xff0c;这里展示一下OpenAI接口的调用 前提条件 访问OpenAI官网&#xff08;国内需要翻墙&#xff09;的账号&#xff0c;需要sk 地址&#xff1a;https://platform.openai.com 依赖 使用开源工具调用OpenAI接口&#xff0c;依赖如下&am…

Vue3封装一个轮播图组件

先看效果 编写组件代码 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

centos7部署docker

文章目录 &#xff08;1&#xff09;安装前准备&#xff08;2&#xff09;卸载旧版Docker&#xff08;3&#xff09;安装docker&#xff08;4&#xff09;配置镜像加速 &#xff08;1&#xff09;安装前准备 在开始安装之前&#xff0c;首先需要检查内核版本。使用 uname -r 命…

nodejs微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络&#xff08;VGG&#xff09;1.3. 网络中的网络&#xff08;NiN&#xff09;1.4. 含并行连结的网络&#xff08;GoogLeNet&#xff09; 2. 实例解析2.1…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…