src/main/java/com/ycl/jxkg/config/spring/security/RestAuthenticationSuccessHandler.java
@@ -5,8 +5,10 @@ import com.ycl.jxkg.constants.CaffeineConstant; import com.ycl.jxkg.domain.entity.SysConfig; import com.ycl.jxkg.domain.entity.UserEventLog; import com.ycl.jxkg.domain.vo.student.user.UserLoginVO; import com.ycl.jxkg.enums.general.YesOrNoEnum; import com.ycl.jxkg.event.UserEvent; import com.ycl.jxkg.mapper.ClassesUserMapper; import com.ycl.jxkg.mapper.SysConfigMapper; import com.ycl.jxkg.service.UserService; import com.ycl.jxkg.utils.CaffeineUtil; @@ -42,6 +44,8 @@ private final UserService userService; private final CaffeineUtil caffeineUtil; private final SysConfigMapper sysConfigMapper; @Autowired private ClassesUserMapper classesUserMapper; /** * Instantiates a new Rest authentication success handler. @@ -83,9 +87,11 @@ UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date()); userEventLog.setContent(user.getUserName() + " 登录了江西语音视频培训系统"); eventPublisher.publishEvent(new UserEvent(userEventLog)); com.ycl.jxkg.domain.entity.User newUser = new com.ycl.jxkg.domain.entity.User(); BeanUtils.copyProperties(user,newUser); RestUtil.response(response, SystemCode.OK.getCode(), SystemCode.OK.getMessage(), newUser); UserLoginVO userLoginVO = new UserLoginVO(); BeanUtils.copyProperties(user,userLoginVO); List<String> classesNames = classesUserMapper.getClassesNameByUserId(user.getId()); userLoginVO.setClassName(classesNames); RestUtil.response(response, SystemCode.OK.getCode(), SystemCode.OK.getMessage(), userLoginVO); } } else { RestUtil.response(response, SystemCode.UNAUTHORIZED.getCode(), SystemCode.UNAUTHORIZED.getMessage()); src/main/java/com/ycl/jxkg/controller/admin/UserController.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.base.SystemCode; import com.ycl.jxkg.context.WebContext; import com.ycl.jxkg.domain.form.UpdatePwdForm; import com.ycl.jxkg.enums.RoleEnum; import com.ycl.jxkg.domain.other.KeyValue; @@ -38,9 +40,17 @@ private final UserService userService; private final UserEventLogService userEventLogService; private final AuthenticationService authenticationService; private final WebContext webContext; private final Integer teacher = 2; private final Integer student = 1; @RequestMapping(value = "/page/list", method = RequestMethod.POST) public Result<PageInfo<UserResponseVO>> pageList(@RequestBody UserPageRequestVO model) { if(!student.equals(model.getRole())) { User currentUser = webContext.getCurrentUser(); if (teacher.equals(currentUser.getRole())) { return Result.fail(SystemCode.InnerError.getCode(), "您没有访问权限"); } } PageInfo<User> pageInfo = userService.userPage(model); PageInfo<UserResponseVO> page = PageInfoHelper.copyMap(pageInfo, d -> UserResponseVO.from(d)); return Result.ok(page); src/main/java/com/ycl/jxkg/controller/student/UploadController.java
@@ -3,10 +3,13 @@ import com.ycl.jxkg.base.BaseApiController; import com.ycl.jxkg.base.Result; import com.ycl.jxkg.config.RuoYiConfig; import com.ycl.jxkg.service.FileUpload; import com.ycl.jxkg.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @@ -14,33 +17,51 @@ import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.UUID; @RequiredArgsConstructor @RequestMapping("/api/student/upload") @RestController("StudentUploadController") public class UploadController extends BaseApiController { private final FileUpload fileUpload; private final UserService userService; private final RuoYiConfig ruoYiConfig; @RequestMapping("/image") @ResponseBody public Result questionUploadAndReadExcel(HttpServletRequest request) { MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; MultipartFile multipartFile = multipartHttpServletRequest.getFile("file"); long attachSize = multipartFile.getSize(); String imgName = multipartFile.getOriginalFilename(); try (InputStream inputStream = multipartFile.getInputStream()) { String filePath = fileUpload.uploadFile(inputStream, attachSize, imgName); userService.changePicture(getCurrentUser(), filePath); return Result.ok(filePath); } catch (IOException e) { return Result.fail(2, e.getMessage()); @PostMapping("/image") public Result questionUploadAndReadExcel(MultipartFile file) { // 检查文件是否为空 if (file == null || file.isEmpty()) { return Result.fail(500, "上传的文件为空"); } String randomName = null; HashMap hashMap = new HashMap(2); try { // 获取文件名 String originalFileName = StringUtils.cleanPath(file.getOriginalFilename()); randomName = UUID.randomUUID().toString().replace("-", "") + originalFileName.substring(originalFileName.lastIndexOf(".")); // 指定文件存储路径 String uploadDir = ruoYiConfig.getUrl(); // 修改为您希望存储的目录 // 如果目录不存在,则创建目录 File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } // 构建目标文件的路径 String filePath = uploadDir + "/" + randomName; // 将文件保存到目标位置 file.transferTo(new File(filePath)); hashMap.put("name", originalFileName); hashMap.put("url", randomName); } catch (IOException e) { e.printStackTrace(); // 返回失败响应 return Result.fail(500, "文件上传失败"); } userService.changePicture(getCurrentUser(), randomName); return Result.ok(hashMap); } } src/main/java/com/ycl/jxkg/controller/student/UserController.java
@@ -6,6 +6,8 @@ import com.ycl.jxkg.domain.entity.MessageUser; import com.ycl.jxkg.domain.entity.User; import com.ycl.jxkg.domain.entity.UserEventLog; import com.ycl.jxkg.domain.form.StudentUpdatePwdForm; import com.ycl.jxkg.domain.form.UpdatePwdForm; import com.ycl.jxkg.enums.RoleEnum; import com.ycl.jxkg.enums.UserStatusEnum; import com.ycl.jxkg.event.UserEvent; @@ -17,10 +19,12 @@ import com.ycl.jxkg.utils.PageInfoHelper; import com.ycl.jxkg.domain.vo.student.user.*; import com.github.pagehelper.PageInfo; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationEventPublisher; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -69,12 +73,8 @@ return Result.ok(); } @RequestMapping(value = "/update", method = RequestMethod.POST) public Result update(@RequestBody @Valid UserUpdateVO model) { if (StringUtils.isBlank(model.getBirthDay())) { model.setBirthDay(null); } User user = userService.getById(getCurrentUser().getId()); BeanUtils.copyProperties(model, user); user.setModifyTime(new Date()); @@ -130,4 +130,10 @@ return Result.ok(); } @ApiOperation(value = "修改密码", tags = {"修改密码"}) @PostMapping("/update/password") public Result<Object> updatePassword(@RequestBody @Validated StudentUpdatePwdForm form) { userService.updateStudentPassword(form); return Result.ok("修改成功"); } } src/main/java/com/ycl/jxkg/controller/wx/student/UserController.java
@@ -74,9 +74,6 @@ @RequestMapping(value = "/update", method = RequestMethod.POST) public Result<UserResponseVO> update(@Valid UserUpdateVO model) { if (StringUtils.isBlank(model.getBirthDay())) { model.setBirthDay(null); } User user = userService.getById(getCurrentUser().getId()); BeanUtils.copyProperties(model, user); user.setModifyTime(new Date()); src/main/java/com/ycl/jxkg/domain/form/StudentUpdatePwdForm.java
New file @@ -0,0 +1,27 @@ package com.ycl.jxkg.domain.form; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * 修改密码表单数据 * * @author:xp * @date:2024/7/9 16:23 */ @Data public class StudentUpdatePwdForm { @NotNull(message = "修改失败") private Integer userId; /** 新密码 */ @NotBlank(message = "请输入新密码") private String newPassword; /** 旧密码 */ @NotBlank(message = "请输入旧密码") private String oldPassword; } src/main/java/com/ycl/jxkg/domain/vo/admin/education/EducationResourceVO.java
@@ -15,9 +15,9 @@ */ @Data public class EducationResourceVO { /** 当前页大小 */ private Integer pageSize = 10; /** 当前页 */ private Integer pageNum = 1; private Integer id; src/main/java/com/ycl/jxkg/domain/vo/student/user/UserLoginVO.java
New file @@ -0,0 +1,71 @@ package com.ycl.jxkg.domain.vo.student.user; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; import java.util.List; @Data public class UserLoginVO { private Integer id; private String userUuid; private List<String> className; /** * 用户名 */ private String userName; /** * 真实姓名 */ private String realName; private Integer age; /** * 1.男 2女 */ private Integer sex; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date birthDay; private String phone; /** * 1.学生 2.老师 3.管理员 */ private Integer role; /** * 1.启用 2禁用 */ private Integer status; /** * 头像地址 */ private String imagePath; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date modifyTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date lastActiveTime; /** * 微信openId */ private String wxOpenId; /** * 上一次修改密码的时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date lastUpdatePasswordTime; } src/main/java/com/ycl/jxkg/domain/vo/student/user/UserUpdateVO.java
@@ -1,26 +1,26 @@ package com.ycl.jxkg.domain.vo.student.user; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.Date; @Data public class UserUpdateVO { @NotBlank @NotBlank(message = "真实姓名为空") private String realName; private String age; private Integer sex; @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private Date birthDay; private String birthDay; @NotBlank(message = "手机号为空") private String phone; @NotNull private Integer userLevel; } src/main/java/com/ycl/jxkg/mapper/ClassesUserMapper.java
@@ -49,4 +49,12 @@ * @return */ List<Integer> getClassesByUserId(@Param("userId") Integer userId); /** * 根据学生获取班级名称 * * @param userId * @return */ List<String> getClassesNameByUserId(@Param("userId") Integer userId); } src/main/java/com/ycl/jxkg/service/UserService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.jxkg.domain.form.RegisterForm; import com.ycl.jxkg.domain.form.StudentUpdatePwdForm; import com.ycl.jxkg.domain.form.UpdatePwdForm; import com.ycl.jxkg.domain.other.KeyValue; import com.ycl.jxkg.domain.entity.User; @@ -158,4 +159,10 @@ * @param form */ void updatePassword(UpdatePwdForm form); /** * 学生端修改密码,增加比对原密码操作 * */ void updateStudentPassword(StudentUpdatePwdForm form); } src/main/java/com/ycl/jxkg/service/impl/ExamCheatServiceImpl.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.jxkg.domain.entity.ExamCheat; import com.ycl.jxkg.mapper.ExamCheatMapper; import com.ycl.jxkg.mapper.ExamSubmitTempMapper; import com.ycl.jxkg.service.ExamCheatService; import com.ycl.jxkg.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -29,7 +30,7 @@ public class ExamCheatServiceImpl extends ServiceImpl<ExamCheatMapper, ExamCheat> implements ExamCheatService { private final ExamCheatMapper examCheatMapper; private final ExamSubmitTempMapper examSubmitTempMapper; /** * 添加 * @param form src/main/java/com/ycl/jxkg/service/impl/FileUploadImpl.java
@@ -43,6 +43,7 @@ } catch (QiniuException ex) { logger.error(ex.getMessage(), ex); } return null; } } src/main/java/com/ycl/jxkg/service/impl/UserServiceImpl.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiniu.util.Md5; import com.ycl.jxkg.domain.entity.UserEventLog; import com.ycl.jxkg.domain.form.StudentUpdatePwdForm; import com.ycl.jxkg.domain.form.UpdatePwdForm; import com.ycl.jxkg.enums.RoleEnum; import com.ycl.jxkg.enums.UserStatusEnum; @@ -196,4 +197,23 @@ .set(User::getLastUpdatePasswordTime, new Date()) .update(); } @Override public void updateStudentPassword(StudentUpdatePwdForm form) { User user = baseMapper.selectById(form.getUserId()); if(user ==null){ throw new RuntimeException("用户不存在"); } if(authenticationService.authUser(user,user.getUserName(),form.getOldPassword())){ //密码正确 new LambdaUpdateChainWrapper<>(baseMapper) .eq(User::getId, form.getUserId()) .set(User::getPassword, authenticationService.pwdEncode(form.getNewPassword())) .set(User::getLastUpdatePasswordTime, new Date()) .update(); }else { //密码错误 throw new RuntimeException("旧密码错误,请确认后重新输入"); } } } src/main/resources/mapper/ClassesUserMapper.xml
@@ -70,4 +70,11 @@ from t_classes_user where user_id = #{userId} and deleted = 0 </select> <select id="getClassesNameByUserId" resultType="java.lang.String"> select tc.class_name from t_classes_user tcu left join t_classes tc on tcu.classes_id = tc.id where user_id = #{userId} and tcu.deleted = 0 and tc.deleted =0 </select> </mapper> src/main/resources/mapper/UserMapper.xml
@@ -135,6 +135,9 @@ <set> <if test="realName != null">real_name = #{realName},</if> <if test="age != null">age = #{age},</if> <if test="sex != null">sex = #{sex},</if> <if test="phone != null and phone !='' ">phone = #{phone},</if> <if test="birthDay != null ">birth_day = #{birthDay},</if> <if test="lastActiveTime != null">last_active_time = #{lastActiveTime},</if> </set> where id = #{id}