在線學習平臺------手把手教程👈
用戶管理
添加功能增強
新增屬性
若依里的用戶模塊(SysUser)是沒有課程這一屬性的,要實現我們自己的課程分頁查詢功能
這個位置傳入的實體類SysUser要加上classId,記得加上get、set方法
更改sql語句
ctrl + 鼠標左鍵不斷點進去,查看調用位置
加入swagger文檔:
package com.ruoyi.web.controller.system.SysUserController加上Api(tags = "用戶管理")
在add方法上加ApiOperation("用戶添加")
?
user_name是賬號,nick_name才是昵稱
所需參數
修改功能增強
和添加操作一樣,需要在sql語句那邊加上classId屬性
查詢功能
修改之前要寫上先寫查詢功能
也和添加操作一樣,一直點到sql語句的位置
課程模塊:
班級名稱和教師名稱是采用關聯的方式得到
?前期準備:
?
先在domain自動生成實體類MsCourse
用lombok代替get、set方法,數據類型都改成包裝類
設置實體類的自動遞增、主鍵、自動填充
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
第一步:
? ? ? ? 在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實現這個方法
?
第三步
? ? ? ? 在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);}
?添加接口
課程需要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));}
修改接口
修改相較于添加,要多傳入一個課程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寫過一樣的查詢語句,可以將之前的語句抽取出來公用
mapper層
在MsCourseMapper里加上方法
寫上對應的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加上對應的方法,然后實現它
最終代碼代碼
@ApiOperation("查詢詳情")@GetMapping("/{courseId}")// @PathVariable參數放在路徑上public Result<MsCourseDtlVo> getById(@PathVariable Long courseId){//這個位置不需要轉,直接返回就行return Result.success(msCourseService.getDtlById(courseId));}
查詢教師列表
sql1
得到每個教師對應的信息
where后面這樣寫健壯性低,(如果刪除了一個教師,又填了一個,role_id就變成了4)可以用一個專門的標識teacher來過濾
sql2
t1和t2關聯得到每個用戶的身份id,再用這個身份id去關聯角色表,找出對應標識為teacher的數據
如果刪除了一個教師,再新增,那么新的role_id雖然為4,但角色的唯一標識依然是teacher
這兩張表可以得到role_id
再用這個role_id,就可以得到role_key
上面的sql語句只需要user_id和nick_name就可以了
根據唯一標識(role_key獲取對應用戶信息)
實體類
在對應位置com.ruoyi.system.domain.vo創建實體類
(這個功能是系統模塊的)
在mapper層寫上對應方法去實現
<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層
controller
控制層的調用在ruoyi-admin的SysUserController里
@ApiOperation(value = "根據roleKey獲取用戶",notes = "teacher代表教師")@GetMapping("/users/{roleKey}")public AjaxResult getUsersByRoleKey(@PathVariable String roleKey){return success(userService.selectUsersByRoleKey(roleKey));}
?
?