Commit 0181baa72ba2d983a873c392514944989575659b

Authored by niudehua
1 parent 4e5430b5

增加 个人信息设置 功能

src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java
1 package cn.iocoder.dashboard.modules.system.controller.user; 1 package cn.iocoder.dashboard.modules.system.controller.user;
2 2
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.framework.security.core.LoginUser;
  5 +import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
  9 +import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
  10 +import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
  12 +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
  13 +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
  14 +import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
  15 +import io.swagger.annotations.Api;
  16 +import io.swagger.annotations.ApiOperation;
  17 +import org.springframework.web.bind.annotation.GetMapping;
  18 +import org.springframework.web.bind.annotation.PostMapping;
  19 +import org.springframework.web.bind.annotation.RequestBody;
  20 +import org.springframework.web.bind.annotation.RequestMapping;
  21 +import org.springframework.web.bind.annotation.RequestParam;
  22 +import org.springframework.web.bind.annotation.RestController;
  23 +import org.springframework.web.multipart.MultipartFile;
  24 +
  25 +import javax.annotation.Resource;
  26 +import javax.servlet.http.HttpServletRequest;
  27 +import java.util.List;
  28 +import java.util.stream.Collectors;
  29 +
  30 +/**
  31 + * @author niudehua
  32 + */
  33 +@Api(tags = "用户个人中心")
  34 +@RestController
  35 +@RequestMapping("/system/user/profile")
3 public class SysUserProfileController { 36 public class SysUserProfileController {
4 37
5 -// /**  
6 -// * 个人信息  
7 -// */  
8 -// @GetMapping  
9 -// public AjaxResult profile()  
10 -// {  
11 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
12 -// SysUser user = loginUser.getUser();  
13 -// AjaxResult ajax = AjaxResult.success(user);  
14 -// ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));  
15 -// ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));  
16 -// return ajax;  
17 -// }  
18 -//  
19 -// /**  
20 -// * 修改用户  
21 -// */  
22 -// @Log(title = "个人信息", businessType = BusinessType.UPDATE)  
23 -// @PutMapping  
24 -// public AjaxResult updateProfile(@RequestBody SysUser user)  
25 -// {  
26 -// if (userService.updateUserProfile(user) > 0)  
27 -// {  
28 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
29 -// // 更新缓存用户信息  
30 -// loginUser.getUser().setNickName(user.getNickName());  
31 -// loginUser.getUser().setPhonenumber(user.getPhonenumber());  
32 -// loginUser.getUser().setEmail(user.getEmail());  
33 -// loginUser.getUser().setSex(user.getSex());  
34 -// tokenService.setLoginUser(loginUser);  
35 -// return AjaxResult.success();  
36 -// }  
37 -// return AjaxResult.error("修改个人信息异常,请联系管理员");  
38 -// }  
39 -//  
40 -// /**  
41 -// * 重置密码  
42 -// */  
43 -// @Log(title = "个人信息", businessType = BusinessType.UPDATE)  
44 -// @PutMapping("/updatePwd")  
45 -// public AjaxResult updatePwd(String oldPassword, String newPassword)  
46 -// {  
47 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
48 -// String userName = loginUser.getUsername();  
49 -// String password = loginUser.getPassword();  
50 -// if (!SecurityUtils.matchesPassword(oldPassword, password))  
51 -// {  
52 -// return AjaxResult.error("修改密码失败,旧密码错误");  
53 -// }  
54 -// if (SecurityUtils.matchesPassword(newPassword, password))  
55 -// {  
56 -// return AjaxResult.error("新密码不能与旧密码相同");  
57 -// }  
58 -// if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)  
59 -// {  
60 -// // 更新缓存用户密码  
61 -// loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));  
62 -// tokenService.setLoginUser(loginUser);  
63 -// return AjaxResult.success();  
64 -// }  
65 -// return AjaxResult.error("修改密码异常,请联系管理员");  
66 -// }  
67 -//  
68 -// /**  
69 -// * 头像上传  
70 -// */  
71 -// @Log(title = "用户头像", businessType = BusinessType.UPDATE)  
72 -// @PostMapping("/avatar")  
73 -// public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException  
74 -// {  
75 -// if (!file.isEmpty())  
76 -// {  
77 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
78 -// String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);  
79 -// if (userService.updateUserAvatar(loginUser.getUsername(), avatar))  
80 -// {  
81 -// AjaxResult ajax = AjaxResult.success();  
82 -// ajax.put("imgUrl", avatar);  
83 -// // 更新缓存用户头像  
84 -// loginUser.getUser().setAvatar(avatar);  
85 -// tokenService.setLoginUser(loginUser);  
86 -// return ajax;  
87 -// }  
88 -// }  
89 -// return AjaxResult.error("上传图片异常,请联系管理员");  
90 -// } 38 + @Resource
  39 + private SysUserService userService;
  40 + @Resource
  41 + private SysPermissionService permissionService;
  42 + @Resource
  43 + private SysRoleService roleService;
  44 +
  45 + /**
  46 + * 个人信息
  47 + *
  48 + * @return 个人信息详情
  49 + */
  50 + @ApiOperation("获得登录用户信息")
  51 + @GetMapping("/get")
  52 + public CommonResult<SysUserProfileRespVO> profile() {
  53 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
  54 + // 获取用户信息
  55 + assert loginUser != null;
  56 + Long userId = loginUser.getId();
  57 + SysUserDO user = userService.getUser(userId);
  58 + SysUserProfileRespVO userProfileRespVO = SysUserConvert.INSTANCE.convert03(user);
  59 + List<SysRoleDO> userRoles = roleService.listRolesFromCache(permissionService.listUserRoleIs(userId));
  60 + userProfileRespVO.setRoles(userRoles.stream().map(SysUserConvert.INSTANCE::convert).collect(Collectors.toSet()));
  61 + return CommonResult.success(userProfileRespVO);
  62 + }
  63 +
  64 + /**
  65 + * 修改个人信息
  66 + *
  67 + * @param reqVO 个人信息更新 reqVO
  68 + * @param request HttpServletRequest
  69 + * @return 修改结果
  70 + */
  71 + @ApiOperation("修改用户个人信息")
  72 + @PostMapping("/update")
  73 + public CommonResult<Boolean> updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) {
  74 + if (userService.updateUserProfile(reqVO) > 0) {
  75 + SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request);
  76 + return CommonResult.success(true);
  77 + }
  78 + return CommonResult.success(false);
  79 + }
91 80
  81 + /**
  82 + * 上传用户个人头像
  83 + *
  84 + * @param file 头像文件
  85 + * @return 上传结果
  86 + */
  87 + @ApiOperation("上传用户个人头像")
  88 + @PostMapping("/uploadAvatar")
  89 + public CommonResult<Boolean> uploadAvatar(@RequestParam("avatarFile") MultipartFile file) {
  90 + if (!file.isEmpty()) {
  91 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
  92 + assert loginUser != null;
  93 + if (userService.updateAvatar(loginUser.getId(), file) > 0) {
  94 + return CommonResult.success(true);
  95 + }
  96 + }
  97 + return CommonResult.success(false);
  98 + }
92 } 99 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.NoArgsConstructor;
  9 +
  10 +import java.util.Set;
  11 +
  12 +
  13 +@ApiModel("用户个人中心信息 Response VO")
  14 +@Data
  15 +@NoArgsConstructor
  16 +@AllArgsConstructor
  17 +@EqualsAndHashCode(callSuper = true)
  18 +public class SysUserProfileRespVO extends SysUserRespVO {
  19 +
  20 + @ApiModelProperty(value = "旧密码", required = true, example = "123456")
  21 + private String oldPassword;
  22 +
  23 + @ApiModelProperty(value = "新密码", required = true, example = "123456")
  24 + private String newPassword;
  25 + /**
  26 + * 所属角色
  27 + */
  28 + @ApiModelProperty(value = "所属角色", required = true, example = "123456")
  29 + private Set<Role> roles;
  30 +
  31 + @ApiModel("角色")
  32 + @Data
  33 + public static class Role {
  34 +
  35 + @ApiModelProperty(value = "角色编号", required = true, example = "1")
  36 + private Long id;
  37 +
  38 + @ApiModelProperty(value = "角色名称", required = true, example = "普通角色")
  39 + private String name;
  40 +
  41 + }
  42 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@ApiModel("用户更新 Request VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +public class SysUserProfileUpdateReqVO extends SysUserBaseVO {
  14 +
  15 + @ApiModelProperty(value = "用户编号", required = true, example = "1024")
  16 + @NotNull(message = "用户编号不能为空")
  17 + private Long id;
  18 +
  19 + @ApiModelProperty(value = "旧密码", required = true, example = "123456")
  20 + private String oldPassword;
  21 +
  22 + @ApiModelProperty(value = "新密码", required = true, example = "654321")
  23 + private String newPassword;
  24 +
  25 +}
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
@@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.convert.auth; @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.convert.auth;
3 import cn.iocoder.dashboard.framework.security.core.LoginUser; 3 import cn.iocoder.dashboard.framework.security.core.LoginUser;
4 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; 4 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO;
5 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; 5 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;
6 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO;
7 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; 8 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
8 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
@@ -13,26 +14,33 @@ import org.mapstruct.Mapping; @@ -13,26 +14,33 @@ import org.mapstruct.Mapping;
13 import org.mapstruct.factory.Mappers; 14 import org.mapstruct.factory.Mappers;
14 import org.slf4j.LoggerFactory; 15 import org.slf4j.LoggerFactory;
15 16
16 -import java.util.*; 17 +import java.util.ArrayList;
  18 +import java.util.Comparator;
  19 +import java.util.LinkedHashMap;
  20 +import java.util.List;
  21 +import java.util.Map;
17 22
18 @Mapper 23 @Mapper
19 public interface SysAuthConvert { 24 public interface SysAuthConvert {
20 25
21 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); 26 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
22 27
23 - @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 28 + @Mapping(source = "updateTime", target = "updateTime", ignore = true)
  29 + // 字段相同,但是含义不同,忽略
24 LoginUser convert(SysUserDO bean); 30 LoginUser convert(SysUserDO bean);
25 31
26 default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) { 32 default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
27 return SysAuthPermissionInfoRespVO.builder() 33 return SysAuthPermissionInfoRespVO.builder()
28 - .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build())  
29 - .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode))  
30 - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission))  
31 - .build(); 34 + .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build())
  35 + .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode))
  36 + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission))
  37 + .build();
32 } 38 }
33 39
34 SysAuthMenuRespVO convertTreeNode(SysMenuDO menu); 40 SysAuthMenuRespVO convertTreeNode(SysMenuDO menu);
35 41
  42 + LoginUser convert(SysUserProfileUpdateReqVO reqVO);
  43 +
36 /** 44 /**
37 * 将菜单列表,构建成菜单树 45 * 将菜单列表,构建成菜单树
38 * 46 *
@@ -47,12 +55,12 @@ public interface SysAuthConvert { @@ -47,12 +55,12 @@ public interface SysAuthConvert {
47 Map<Long, SysAuthMenuRespVO> treeNodeMap = new LinkedHashMap<>(); 55 Map<Long, SysAuthMenuRespVO> treeNodeMap = new LinkedHashMap<>();
48 menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); 56 menuList.forEach(menu -> treeNodeMap.put(menu.getId(), SysAuthConvert.INSTANCE.convertTreeNode(menu)));
49 // 处理父子关系 57 // 处理父子关系
50 - treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach((childNode) -> { 58 + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> {
51 // 获得父节点 59 // 获得父节点
52 SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); 60 SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId());
53 if (parentNode == null) { 61 if (parentNode == null) {
54 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", 62 LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
55 - childNode.getId(), childNode.getParentId()); 63 + childNode.getId(), childNode.getParentId());
56 return; 64 return;
57 } 65 }
58 // 将自己添加到父节点中 66 // 将自己添加到父节点中
src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.user; 1 package cn.iocoder.dashboard.modules.system.convert.user;
2 2
3 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; 3 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExcelVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
5 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
6 import org.mapstruct.Mapper; 13 import org.mapstruct.Mapper;
7 import org.mapstruct.factory.Mappers; 14 import org.mapstruct.factory.Mappers;
@@ -23,4 +30,12 @@ public interface SysUserConvert { @@ -23,4 +30,12 @@ public interface SysUserConvert {
23 30
24 SysUserDO convert(SysUserImportExcelVO bean); 31 SysUserDO convert(SysUserImportExcelVO bean);
25 32
  33 + SysUserProfileRespVO convert03(SysUserDO bean);
  34 +
  35 + SysUserProfileRespVO.Role convert(SysRoleDO bean);
  36 +
  37 + SysUserDO convert(SysUserProfileUpdateReqVO bean);
  38 +
  39 +
  40 +
26 } 41 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
@@ -40,6 +40,7 @@ public interface SysErrorCodeConstants { @@ -40,6 +40,7 @@ public interface SysErrorCodeConstants {
40 ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在"); 40 ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在");
41 ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); 41 ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在");
42 ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!"); 42 ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!");
  43 + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002004005, "用户密码校验失败");
43 44
44 // ========== 部门模块 1002005000 ========== 45 // ========== 部门模块 1002005000 ==========
45 ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); 46 ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门");
@@ -74,5 +75,6 @@ public interface SysErrorCodeConstants { @@ -74,5 +75,6 @@ public interface SysErrorCodeConstants {
74 75
75 // ========== 文件 1002009000 ========== 76 // ========== 文件 1002009000 ==========
76 ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在"); 77 ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在");
  78 + ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败");
77 79
78 } 80 }
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java
@@ -2,9 +2,16 @@ package cn.iocoder.dashboard.modules.system.service.user; @@ -2,9 +2,16 @@ package cn.iocoder.dashboard.modules.system.service.user;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; 5 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
  10 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;
  11 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
6 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
7 import cn.iocoder.dashboard.util.collection.CollectionUtils; 13 import cn.iocoder.dashboard.util.collection.CollectionUtils;
  14 +import org.springframework.web.multipart.MultipartFile;
8 15
9 import java.util.Collection; 16 import java.util.Collection;
10 import java.util.HashMap; 17 import java.util.HashMap;
@@ -103,6 +110,14 @@ public interface SysUserService { @@ -103,6 +110,14 @@ public interface SysUserService {
103 void updateUser(SysUserUpdateReqVO reqVO); 110 void updateUser(SysUserUpdateReqVO reqVO);
104 111
105 /** 112 /**
  113 + * 修改用户个人信息
  114 + *
  115 + * @param reqVO 用户个人信息
  116 + * @return 修改结果
  117 + */
  118 + int updateUserProfile(SysUserProfileUpdateReqVO reqVO);
  119 +
  120 + /**
106 * 删除用户 121 * 删除用户
107 * 122 *
108 * @param id 用户编号 123 * @param id 用户编号
@@ -112,7 +127,7 @@ public interface SysUserService { @@ -112,7 +127,7 @@ public interface SysUserService {
112 /** 127 /**
113 * 修改密码 128 * 修改密码
114 * 129 *
115 - * @param id 用户编号 130 + * @param id 用户编号
116 * @param password 密码 131 * @param password 密码
117 */ 132 */
118 void updateUserPassword(Long id, String password); 133 void updateUserPassword(Long id, String password);
@@ -120,7 +135,7 @@ public interface SysUserService { @@ -120,7 +135,7 @@ public interface SysUserService {
120 /** 135 /**
121 * 修改密码 136 * 修改密码
122 * 137 *
123 - * @param id 用户编号 138 + * @param id 用户编号
124 * @param status 状态 139 * @param status 状态
125 */ 140 */
126 void updateUserStatus(Long id, Integer status); 141 void updateUserStatus(Long id, Integer status);
@@ -128,12 +143,21 @@ public interface SysUserService { @@ -128,12 +143,21 @@ public interface SysUserService {
128 /** 143 /**
129 * 批量导入用户 144 * 批量导入用户
130 * 145 *
131 - * @param importUsers 导入用户列表 146 + * @param importUsers 导入用户列表
132 * @param isUpdateSupport 是否支持更新 147 * @param isUpdateSupport 是否支持更新
133 * @return 导入结果 148 * @return 导入结果
134 */ 149 */
135 SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport); 150 SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport);
136 151
  152 + /**
  153 + * 更新用户头像
  154 + *
  155 + * @param id 用户 id
  156 + * @param avatarFile 头像文件
  157 + * @return 更新结果
  158 + */
  159 + int updateAvatar(Long id, MultipartFile avatarFile);
  160 +
137 // 161 //
138 // /** 162 // /**
139 // * 修改用户基本信息 163 // * 修改用户基本信息
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java
1 package cn.iocoder.dashboard.modules.system.service.user; 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.io.IoUtil;
4 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 6 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
6 import cn.iocoder.dashboard.common.exception.ServiceException; 7 import cn.iocoder.dashboard.common.exception.ServiceException;
7 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; 8 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
8 import cn.iocoder.dashboard.common.pojo.PageResult; 9 import cn.iocoder.dashboard.common.pojo.PageResult;
9 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; 10 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
  11 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;
  12 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
  13 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
  14 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
  15 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;
  16 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
10 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 17 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
11 -import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;  
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; 18 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
13 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; 19 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
14 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 20 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
  21 +import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;
  22 +import cn.iocoder.dashboard.modules.system.service.common.SysFileService;
15 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; 23 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
16 import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; 24 import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
17 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; 25 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
@@ -20,9 +28,17 @@ import lombok.extern.slf4j.Slf4j; @@ -20,9 +28,17 @@ import lombok.extern.slf4j.Slf4j;
20 import org.springframework.security.crypto.password.PasswordEncoder; 28 import org.springframework.security.crypto.password.PasswordEncoder;
21 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
22 import org.springframework.transaction.annotation.Transactional; 30 import org.springframework.transaction.annotation.Transactional;
  31 +import org.springframework.web.multipart.MultipartFile;
23 32
24 import javax.annotation.Resource; 33 import javax.annotation.Resource;
25 -import java.util.*; 34 +import java.io.IOException;
  35 +import java.util.ArrayList;
  36 +import java.util.Collection;
  37 +import java.util.Collections;
  38 +import java.util.LinkedHashMap;
  39 +import java.util.List;
  40 +import java.util.Map;
  41 +import java.util.Set;
26 42
27 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; 43 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
28 44
@@ -49,6 +65,9 @@ public class SysUserServiceImpl implements SysUserService { @@ -49,6 +65,9 @@ public class SysUserServiceImpl implements SysUserService {
49 @Resource 65 @Resource
50 private PasswordEncoder passwordEncoder; 66 private PasswordEncoder passwordEncoder;
51 67
  68 + @Resource
  69 + private SysFileService fileService;
  70 +
52 // /** 71 // /**
53 // * 根据条件分页查询用户列表 72 // * 根据条件分页查询用户列表
54 // * 73 // *
@@ -108,7 +127,7 @@ public class SysUserServiceImpl implements SysUserService { @@ -108,7 +127,7 @@ public class SysUserServiceImpl implements SysUserService {
108 return Collections.emptySet(); 127 return Collections.emptySet();
109 } 128 }
110 Set<Long> deptIds = CollectionUtils.convertSet(deptService.listDeptsByParentIdFromCache( 129 Set<Long> deptIds = CollectionUtils.convertSet(deptService.listDeptsByParentIdFromCache(
111 - deptId, true), SysDeptDO::getId); 130 + deptId, true), SysDeptDO::getId);
112 deptIds.add(deptId); // 包括自身 131 deptIds.add(deptId); // 包括自身
113 return deptIds; 132 return deptIds;
114 } 133 }
@@ -117,7 +136,7 @@ public class SysUserServiceImpl implements SysUserService { @@ -117,7 +136,7 @@ public class SysUserServiceImpl implements SysUserService {
117 public Long createUser(SysUserCreateReqVO reqVO) { 136 public Long createUser(SysUserCreateReqVO reqVO) {
118 // 校验正确性 137 // 校验正确性
119 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), 138 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
120 - reqVO.getDeptId(), reqVO.getPostIds()); 139 + reqVO.getDeptId(), reqVO.getPostIds());
121 // 插入用户 140 // 插入用户
122 SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO); 141 SysUserDO user = SysUserConvert.INSTANCE.convert(reqVO);
123 user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 142 user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
@@ -130,13 +149,30 @@ public class SysUserServiceImpl implements SysUserService { @@ -130,13 +149,30 @@ public class SysUserServiceImpl implements SysUserService {
130 public void updateUser(SysUserUpdateReqVO reqVO) { 149 public void updateUser(SysUserUpdateReqVO reqVO) {
131 // 校验正确性 150 // 校验正确性
132 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), 151 this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
133 - reqVO.getDeptId(), reqVO.getPostIds()); 152 + reqVO.getDeptId(), reqVO.getPostIds());
134 // 更新用户 153 // 更新用户
135 SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO); 154 SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO);
136 userMapper.updateById(updateObj); 155 userMapper.updateById(updateObj);
137 } 156 }
138 157
139 @Override 158 @Override
  159 + public int updateUserProfile(SysUserProfileUpdateReqVO reqVO) {
  160 + // 校验正确性
  161 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
  162 + reqVO.getDeptId(), reqVO.getPostIds());
  163 +
  164 + SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO);
  165 + // 校验旧密码
  166 + if (checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) {
  167 + return userMapper.updateById(updateObj);
  168 + }
  169 +
  170 + String encode = passwordEncoder.encode(reqVO.getNewPassword());
  171 + updateObj.setPassword(encode);
  172 + return userMapper.updateById(updateObj);
  173 + }
  174 +
  175 + @Override
140 public void deleteUser(Long id) { 176 public void deleteUser(Long id) {
141 // 校验用户存在 177 // 校验用户存在
142 this.checkUserExists(id); 178 this.checkUserExists(id);
@@ -278,6 +314,21 @@ public class SysUserServiceImpl implements SysUserService { @@ -278,6 +314,21 @@ public class SysUserServiceImpl implements SysUserService {
278 }); 314 });
279 } 315 }
280 316
  317 + private boolean checkOldPassword(Long id, String oldPassword, String newPassword) {
  318 + if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) {
  319 + return true;
  320 + }
  321 + SysUserDO user = userMapper.selectById(id);
  322 + if (user == null) {
  323 + throw ServiceExceptionUtil.exception(USER_NOT_EXISTS);
  324 + }
  325 +
  326 + if (!passwordEncoder.matches(oldPassword, user.getPassword())) {
  327 + throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED);
  328 + }
  329 + return false;
  330 + }
  331 +
281 @Override 332 @Override
282 @Transactional // 添加事务,异常则回滚所有导入 333 @Transactional // 添加事务,异常则回滚所有导入
283 public SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport) { 334 public SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport) {
@@ -285,12 +336,12 @@ public class SysUserServiceImpl implements SysUserService { @@ -285,12 +336,12 @@ public class SysUserServiceImpl implements SysUserService {
285 throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY); 336 throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY);
286 } 337 }
287 SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>()) 338 SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>())
288 - .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); 339 + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
289 importUsers.forEach(importUser -> { 340 importUsers.forEach(importUser -> {
290 // 校验,判断是否有不符合的原因 341 // 校验,判断是否有不符合的原因
291 try { 342 try {
292 checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), 343 checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
293 - importUser.getDeptId(), null); 344 + importUser.getDeptId(), null);
294 } catch (ServiceException ex) { 345 } catch (ServiceException ex) {
295 respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); 346 respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
296 return; 347 return;
@@ -316,4 +367,21 @@ public class SysUserServiceImpl implements SysUserService { @@ -316,4 +367,21 @@ public class SysUserServiceImpl implements SysUserService {
316 return respVO; 367 return respVO;
317 } 368 }
318 369
  370 + @Override
  371 + public int updateAvatar(Long id, MultipartFile avatarFile) {
  372 + this.checkUserExists(id);
  373 + // 存储文件
  374 + String avatar = null;
  375 + try {
  376 + avatar = fileService.createFile(avatarFile.getOriginalFilename(), IoUtil.readBytes(avatarFile.getInputStream()));
  377 + } catch (IOException e) {
  378 + throw ServiceExceptionUtil.exception(FILE_UPLOAD_FAILED);
  379 + }
  380 + // 更新路径
  381 + SysUserDO sysUserDO = new SysUserDO();
  382 + sysUserDO.setId(id);
  383 + sysUserDO.setAvatar(avatar);
  384 + return userMapper.updateById(sysUserDO);
  385 + }
  386 +
319 } 387 }
src/main/resources/application-dev.yaml
@@ -152,7 +152,7 @@ yudao: @@ -152,7 +152,7 @@ yudao:
152 width: 160 152 width: 160
153 height: 60 153 height: 60
154 file: 154 file:
155 - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ 155 + base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/
156 codegen: 156 codegen:
157 base-package: ${yudao.info.base-package} 157 base-package: ${yudao.info.base-package}
158 db-schemas: ${spring.datasource.name} 158 db-schemas: ${spring.datasource.name}
src/main/resources/application-local.yaml
@@ -152,7 +152,7 @@ yudao: @@ -152,7 +152,7 @@ yudao:
152 width: 160 152 width: 160
153 height: 60 153 height: 60
154 file: 154 file:
155 - base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ 155 + base-path: http://127.0.0.1:${server.port}${yudao.web.api-prefix}/system/file/get/
156 codegen: 156 codegen:
157 base-package: ${yudao.info.base-package} 157 base-package: ${yudao.info.base-package}
158 db-schemas: ${spring.datasource.name} 158 db-schemas: ${spring.datasource.name}