src/main/java/com/ycl/jxkg/controller/admin/ClassesController.java
@@ -65,6 +65,13 @@ return classesService.page(query); } @GetMapping("/dissolution/{id}") @ApiOperation(value = "解散", notes = "解散") @PreAuthorize("hasAuthority('classes:dissolution')") public Result dissolution(@PathVariable("id") Integer id) { return classesService.dissolution(id); } @GetMapping("/{id}") @ApiOperation(value = "详情", notes = "详情") @PreAuthorize("hasAuthority('classes:detail')") src/main/java/com/ycl/jxkg/controller/admin/ClassesUserController.java
New file @@ -0,0 +1,83 @@ package com.ycl.jxkg.controller.admin; import com.ycl.jxkg.group.Update; import com.ycl.jxkg.group.Add; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import lombok.RequiredArgsConstructor; import java.util.List; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotEmpty; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.ycl.jxkg.service.ClassesUserService; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.form.ClassesUserForm; import com.ycl.jxkg.domain.query.ClassesUserQuery; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; /** * 班级学员 * * @author xp * @since 2024-06-04 */ @Validated @RequiredArgsConstructor @Api(value = "班级学员", tags = "班级学员") @RestController @RequestMapping("/api/classes-user") public class ClassesUserController { private final ClassesUserService classesUserService; @PostMapping @ApiOperation(value = "添加", notes = "添加") @PreAuthorize("hasAuthority('classesUser:add')") public Result add(@RequestBody @Validated(Add.class) ClassesUserForm form) { return classesUserService.add(form); } @PutMapping @ApiOperation(value = "修改", notes = "修改") @PreAuthorize("hasAuthority('classesUser:edit')") public Result update(@RequestBody @Validated(Update.class) ClassesUserForm form) { return classesUserService.update(form); } @DeleteMapping("/{id}") @ApiOperation(value = "ID删除", notes = "ID删除") @PreAuthorize("hasAuthority('classesUser:del')") public Result removeById(@PathVariable("id") String id) { return classesUserService.removeById(id); } @DeleteMapping("/batch") @ApiOperation(value = "批量删除", notes = "批量删除") @PreAuthorize("hasAuthority('classesUser:del:batch')") public Result remove(@RequestBody @NotEmpty(message = "请选择数据") List<String> ids) { return classesUserService.remove(ids); } @GetMapping("/page") @ApiOperation(value = "分页", notes = "分页") @PreAuthorize("hasAuthority('classesUser:page')") public Result page(ClassesUserQuery query) { return classesUserService.page(query); } @GetMapping("/{id}") @ApiOperation(value = "详情", notes = "详情") @PreAuthorize("hasAuthority('classesUser:detail')") public Result detail(@PathVariable("id") Integer id) { return classesUserService.detail(id); } @GetMapping("/list") @PreAuthorize("hasAuthority('classesUser:list')") @ApiOperation(value = "列表", notes = "列表") public Result list() { return classesUserService.all(); } } src/main/java/com/ycl/jxkg/controller/admin/UserController.java
@@ -1,11 +1,14 @@ package com.ycl.jxkg.controller.admin; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.enums.RoleEnum; import com.ycl.jxkg.domain.other.KeyValue; import com.ycl.jxkg.domain.entity.User; import com.ycl.jxkg.domain.entity.UserEventLog; import com.ycl.jxkg.domain.enums.UserStatusEnum; import com.ycl.jxkg.domain.vo.StudentVO; import com.ycl.jxkg.service.AuthenticationService; import com.ycl.jxkg.service.UserEventLogService; import com.ycl.jxkg.service.UserService; @@ -23,6 +26,7 @@ import java.util.Date; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @RequiredArgsConstructor @RestController("AdminUserController") @@ -40,6 +44,25 @@ return Result.ok(page); } @RequestMapping(value = "/student/list", method = RequestMethod.GET) public Result<com.ycl.jxkg.domain.vo.student.user.UserResponseVO> studentList() { List<User> studentList = new LambdaQueryChainWrapper<>(userService.getBaseMapper()) .eq(User::getRole, RoleEnum.STUDENT.getCode()) .orderByDesc(User::getCreateTime) .list(); List<StudentVO> studentVOS = studentList.stream().map(item -> { StudentVO student = new StudentVO(); BeanUtils.copyProperties(item, student); return student; }).collect(Collectors.toList()); return Result.ok().data(studentVOS); } @RequestMapping(value = "/classes/students", method = RequestMethod.GET) public Result<com.ycl.jxkg.domain.vo.student.user.UserResponseVO> classesStudent(@RequestParam Integer classesId) { List<StudentVO> studentList = userService.classesStudent(classesId); return Result.ok().data(studentList); } @RequestMapping(value = "/event/page/list", method = RequestMethod.POST) public Result<PageInfo<UserEventLogVO>> eventPageList(@RequestBody UserEventPageRequestVO model) { src/main/java/com/ycl/jxkg/controller/student/UserController.java
@@ -1,5 +1,6 @@ package com.ycl.jxkg.controller.student; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.entity.Message; @@ -46,7 +47,6 @@ UserResponseVO userVm = UserResponseVO.from(user); return Result.ok(userVm); } @RequestMapping(value = "/register", method = RequestMethod.POST) public Result register(@RequestBody @Valid UserRegisterVO model) { src/main/java/com/ycl/jxkg/domain/entity/Classes.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.ycl.jxkg.domain.base.AbsEntity; import com.ycl.jxkg.domain.enums.general.ClassesStatusEnum; import lombok.Data; import java.util.Date; @@ -34,7 +35,7 @@ @TableField("status") /** 班级状态 */ private String status; private ClassesStatusEnum status; @TableField("verify_status") /** 验证状态 */ src/main/java/com/ycl/jxkg/domain/entity/ClassesUser.java
New file @@ -0,0 +1,31 @@ package com.ycl.jxkg.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import com.ycl.jxkg.domain.base.AbsEntity; import lombok.Data; /** * 班级与用户关联表 * * @author xp * @since 2024-06-04 */ @Data @TableName("t_classes_user") public class ClassesUser extends AbsEntity { private static final long serialVersionUID = 1L; @TableField("classes_id") /** */ private Integer classesId; @TableField("user_id") /** */ private Integer userId; } src/main/java/com/ycl/jxkg/domain/enums/general/ClassesStatusEnum.java
New file @@ -0,0 +1,28 @@ package com.ycl.jxkg.domain.enums.general; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.Getter; /** * @author:xp * @date:2024/6/4 9:35 */ @Getter public enum ClassesStatusEnum { NORMAL("normal", "正常"), DISSOLUTION("dissolution", "解散"), ; @EnumValue private final String value; @JsonValue private final String desc; ClassesStatusEnum(String value, String desc) { this.value = value; this.desc = desc; } } src/main/java/com/ycl/jxkg/domain/form/ClassesUserForm.java
New file @@ -0,0 +1,47 @@ package com.ycl.jxkg.domain.form; import com.ycl.jxkg.group.Update; import com.ycl.jxkg.group.Add; import com.ycl.jxkg.domain.base.AbsForm; import com.ycl.jxkg.domain.entity.ClassesUser; import org.springframework.beans.BeanUtils; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import org.springframework.lang.NonNull; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 班级与用户关联表表单 * * @author xp * @since 2024-06-04 */ @Data @ApiModel(value = "ClassesUser表单", description = "班级与用户关联表表单") public class ClassesUserForm extends AbsForm { @NotNull(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private Integer classesId; @NotNull(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private Integer userId; @NotNull(message = "加入时间不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("加入时间") private Date createTime; public static ClassesUser getEntityByForm(@NonNull ClassesUserForm form, ClassesUser entity) { if(entity == null) { entity = new ClassesUser(); } BeanUtils.copyProperties(form, entity); return entity; } } src/main/java/com/ycl/jxkg/domain/query/ClassesUserQuery.java
New file @@ -0,0 +1,22 @@ package com.ycl.jxkg.domain.query; import com.ycl.jxkg.domain.base.AbsQuery; import java.util.List; import org.springframework.lang.NonNull; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 班级与用户关联表查询 * * @author xp * @since 2024-06-04 */ @Data @ApiModel(value = "ClassesUser查询", description = "班级与用户关联表查询") public class ClassesUserQuery extends AbsQuery { } src/main/java/com/ycl/jxkg/domain/vo/ClassesUserVO.java
New file @@ -0,0 +1,40 @@ package com.ycl.jxkg.domain.vo; import com.ycl.jxkg.domain.base.AbsVo; import com.ycl.jxkg.domain.entity.ClassesUser; import java.util.Date; import java.util.List; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 班级与用户关联表展示 * * @author xp * @since 2024-06-04 */ @Data public class ClassesUserVO extends AbsVo { /** */ private Integer classesId; /** */ private Integer userId; /** 加入时间 */ private Date createTime; public static ClassesUserVO getVoByEntity(@NonNull ClassesUser entity, ClassesUserVO vo) { if(vo == null) { vo = new ClassesUserVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } src/main/java/com/ycl/jxkg/domain/vo/ClassesVO.java
@@ -7,6 +7,8 @@ import java.time.LocalDateTime; import java.util.Date; import java.util.List; import com.ycl.jxkg.domain.enums.general.ClassesStatusEnum; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; @@ -38,7 +40,7 @@ private Integer classesNumber; /** 班级状态 */ private String status; private ClassesStatusEnum status; /** 验证状态 */ private String verifyStatus; src/main/java/com/ycl/jxkg/domain/vo/StudentVO.java
New file @@ -0,0 +1,18 @@ package com.ycl.jxkg.domain.vo; import lombok.Data; /** * @author:xp * @date:2024/6/4 11:29 */ @Data public class StudentVO { private Integer id; private String realName; private String phone; } src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java
New file @@ -0,0 +1,34 @@ package com.ycl.jxkg.mapper; import com.ycl.jxkg.domain.entity.ClassesUser; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.jxkg.domain.query.ClassesUserQuery; import com.ycl.jxkg.domain.vo.ClassesUserVO; import com.ycl.jxkg.domain.form.ClassesUserForm; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 班级与用户关联表 Mapper 接口 * * @author xp * @since 2024-06-04 */ @Mapper public interface ClassesUserMapper extends BaseMapper<ClassesUser> { /** * id查找班级与用户关联表 * @param id * @return */ ClassesUserVO getById(Integer id); /** * 分页 */ IPage getPage(IPage page, @Param("query") ClassesUserQuery query); } src/main/java/com/ycl/jxkg/mapper/UserMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.jxkg.domain.other.KeyValue; import com.ycl.jxkg.domain.entity.User; import com.ycl.jxkg.domain.vo.StudentVO; import com.ycl.jxkg.domain.vo.admin.user.UserPageRequestVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -129,4 +130,12 @@ User selectByWxOpenId(@Param("wxOpenId") String wxOpenId); /** * 查询班级下的学生 * * @param classesId * @return */ List<StudentVO> classesStudent(@Param("classesId") Integer classesId); } src/main/java/com/ycl/jxkg/service/ClassesService.java
@@ -5,6 +5,7 @@ import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.form.ClassesForm; import com.ycl.jxkg.domain.query.ClassesQuery; import java.util.List; /** @@ -17,6 +18,7 @@ /** * 添加 * * @param form * @return */ @@ -24,6 +26,7 @@ /** * 修改 * * @param form * @return */ @@ -31,6 +34,7 @@ /** * 批量删除 * * @param ids * @return */ @@ -38,6 +42,7 @@ /** * id删除 * * @param id * @return */ @@ -45,6 +50,7 @@ /** * 分页查询 * * @param query * @return */ @@ -52,6 +58,7 @@ /** * 根据id查找 * * @param id * @return */ @@ -59,7 +66,16 @@ /** * 列表 * * @return */ Result all(); /** * 解散 * * @param id * @return */ Result dissolution(Integer id); } src/main/java/com/ycl/jxkg/service/ClassesUserService.java
New file @@ -0,0 +1,65 @@ package com.ycl.jxkg.service; import com.ycl.jxkg.domain.entity.ClassesUser; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.domain.form.ClassesUserForm; import com.ycl.jxkg.domain.query.ClassesUserQuery; import java.util.List; /** * 班级与用户关联表 服务类 * * @author xp * @since 2024-06-04 */ public interface ClassesUserService extends IService<ClassesUser> { /** * 添加 * @param form * @return */ Result add(ClassesUserForm form); /** * 修改 * @param form * @return */ Result update(ClassesUserForm form); /** * 批量删除 * @param ids * @return */ Result remove(List<String> ids); /** * id删除 * @param id * @return */ Result removeById(String id); /** * 分页查询 * @param query * @return */ Result page(ClassesUserQuery query); /** * 根据id查找 * @param id * @return */ Result detail(Integer id); /** * 列表 * @return */ Result all(); } src/main/java/com/ycl/jxkg/service/UserService.java
@@ -4,6 +4,7 @@ import com.ycl.jxkg.domain.form.RegisterForm; import com.ycl.jxkg.domain.other.KeyValue; import com.ycl.jxkg.domain.entity.User; import com.ycl.jxkg.domain.vo.StudentVO; import com.ycl.jxkg.domain.vo.admin.user.UserPageRequestVO; import com.github.pagehelper.PageInfo; @@ -141,4 +142,12 @@ * @param form */ void studentRegister(RegisterForm form); /** * 查询班级下现有的学生 * * @param classesId * @return */ List<StudentVO> classesStudent(Integer classesId); } src/main/java/com/ycl/jxkg/service/impl/ClassesServiceImpl.java
@@ -1,7 +1,9 @@ package com.ycl.jxkg.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ycl.jxkg.domain.entity.Classes; import com.ycl.jxkg.domain.enums.general.ClassesStatusEnum; import com.ycl.jxkg.mapper.ClassesMapper; import com.ycl.jxkg.service.ClassesService; import com.ycl.jxkg.base.Result; @@ -116,4 +118,13 @@ .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result dissolution(Integer id) { new LambdaUpdateChainWrapper<>(baseMapper) .eq(Classes::getId, id) .set(Classes::getStatus, ClassesStatusEnum.DISSOLUTION) .update(); return Result.ok("解散成功"); } } src/main/java/com/ycl/jxkg/service/impl/ClassesUserServiceImpl.java
New file @@ -0,0 +1,119 @@ package com.ycl.jxkg.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.jxkg.domain.entity.ClassesUser; import com.ycl.jxkg.mapper.ClassesUserMapper; import com.ycl.jxkg.service.ClassesUserService; import com.ycl.jxkg.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.jxkg.domain.form.ClassesUserForm; import com.ycl.jxkg.domain.vo.ClassesUserVO; import com.ycl.jxkg.domain.query.ClassesUserQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.jxkg.utils.PageUtil; import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import java.util.List; import java.util.stream.Collectors; /** * 班级与用户关联表 服务实现类 * * @author xp * @since 2024-06-04 */ @Service @RequiredArgsConstructor public class ClassesUserServiceImpl extends ServiceImpl<ClassesUserMapper, ClassesUser> implements ClassesUserService { private final ClassesUserMapper classesUserMapper; /** * 添加 * @param form * @return */ @Override public Result add(ClassesUserForm form) { ClassesUser entity = ClassesUserForm.getEntityByForm(form, null); baseMapper.insert(entity); return Result.ok("添加成功"); } /** * 修改 * @param form * @return */ @Override public Result update(ClassesUserForm form) { ClassesUser entity = baseMapper.selectById(form.getId()); // 为空抛IllegalArgumentException,做全局异常处理 Assert.notNull(entity, "记录不存在"); BeanUtils.copyProperties(form, entity); baseMapper.updateById(entity); return Result.ok("修改成功"); } /** * 批量删除 * @param ids * @return */ @Override public Result remove(List<String> ids) { baseMapper.deleteBatchIds(ids); return Result.ok("删除成功"); } /** * id删除 * @param id * @return */ @Override public Result removeById(String id) { baseMapper.deleteById(id); return Result.ok("删除成功"); } /** * 分页查询 * @param query * @return */ @Override public Result page(ClassesUserQuery query) { IPage<ClassesUserVO> page = PageUtil.getPage(query, ClassesUserVO.class); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 根据id查找 * @param id * @return */ @Override public Result detail(Integer id) { ClassesUserVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); return Result.ok().data(vo); } /** * 列表 * @return */ @Override public Result all() { List<ClassesUser> entities = baseMapper.selectList(null); List<ClassesUserVO> vos = entities.stream() .map(entity -> ClassesUserVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } } src/main/java/com/ycl/jxkg/service/impl/UserServiceImpl.java
@@ -6,6 +6,7 @@ import com.ycl.jxkg.domain.enums.UserStatusEnum; import com.ycl.jxkg.domain.form.RegisterForm; import com.ycl.jxkg.domain.other.KeyValue; import com.ycl.jxkg.domain.vo.StudentVO; import com.ycl.jxkg.event.UserEvent; import com.ycl.jxkg.exception.BusinessException; import com.ycl.jxkg.domain.entity.User; @@ -171,4 +172,9 @@ userEventLog.setContent("欢迎 " + student.getUserName() + " 注册来到江西空管音视频培训系统"); eventPublisher.publishEvent(new UserEvent(userEventLog)); } @Override public List<StudentVO> classesStudent(Integer classesId) { return userMapper.classesStudent(classesId); } } src/main/resources/mapper/ClassesMapper.xml
@@ -10,7 +10,7 @@ <result column="phone" property="teacherPhone" /> <result column="create_time" property="createTime" /> <result column="classes_number" property="classesNumber" /> <result column="status" property="status" /> <result column="status" property="status" typeHandler="com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler"/> <result column="verify_status" property="verifyStatus" /> <result column="start_time" property="startTime" /> <result column="end_time" property="endTime" /> src/main/resources/mapper/ClassesUserMapper.xml
New file @@ -0,0 +1,43 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.jxkg.mapper.ClassesUserMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.jxkg.domain.vo.ClassesUserVO"> <result column="classes_id" property="classesId" /> <result column="user_id" property="userId" /> <result column="create_time" property="createTime" /> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT TCU.classes_id, TCU.user_id, TCU.create_time, TCU.id FROM t_classes_user TCU WHERE TCU.id = #{id} AND TCU.deleted = 0 </select> <select id="getPage" resultMap="BaseResultMap"> SELECT TCU.classes_id, TCU.user_id, TCU.create_time, TCU.id FROM t_classes_user TCU WHERE TCU.deleted = 0 </select> </mapper> src/main/resources/mapper/UserMapper.xml
@@ -194,5 +194,14 @@ limit 1 </select> <select id="classesStudent" resultType="com.ycl.jxkg.domain.vo.StudentVO"> SELECT tu.id, tu.real_name, tu.phone FROM t_user tu INNER JOIN t_classes_user tcu ON tu.id = tcu.user_id WHERE tcu.classes_id = #{classesId} ORDER BY tcu.create_time </select> </mapper>