Kaynağa Gözat

add:中台增加权限管理(修改账户功能)

lyx 1 hafta önce
ebeveyn
işleme
2d112a5e65

+ 51 - 0
alien-entity/src/main/java/shop/alien/entity/store/dto/SystemUserUpdateDto.java

@@ -0,0 +1,51 @@
+package shop.alien.entity.store.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 系统用户修改DTO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "SystemUserUpdateDto对象", description = "系统用户修改信息")
+public class SystemUserUpdateDto {
+
+    @ApiModelProperty(value = "用户ID", required = true)
+    private Integer userId;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "联系电话")
+    private String phone;
+
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "密码(如果提供则更新密码)")
+    private String password;
+
+    @ApiModelProperty(value = "角色ID列表(支持多角色选择,如果提供则更新角色关系)")
+    private String roleIds;
+
+    @ApiModelProperty(value = "所属部门ID")
+    private String departmentId;
+
+    @ApiModelProperty(value = "备注说明")
+    private String remark;
+
+    @ApiModelProperty(value = "启用状态 1:启用 0:禁用")
+    private Integer status;
+}
+

+ 10 - 0
alien-store/src/main/java/shop/alien/store/controller/SystemController.java

@@ -10,6 +10,7 @@ import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.entity.store.dto.SystemLoginDto;
 import shop.alien.entity.store.dto.SystemUserAddDto;
 import shop.alien.entity.store.dto.SystemUserStatusDto;
+import shop.alien.entity.store.dto.SystemUserUpdateDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
 import shop.alien.store.service.SystemService;
 import shop.alien.util.common.TokenInfo;
@@ -73,6 +74,15 @@ public class SystemController {
         return systemService.updateUserStatus(statusDto);
     }
 
+    @ApiOperation("修改系统用户账号信息")
+    @ApiOperationSupport(order = 5)
+    @PostMapping(value = "/updateUser")
+    public R<LifeSys> updateUser(@RequestBody SystemUserUpdateDto updateDto) {
+        log.info("SystemController.updateUser => userId={}, userName={}, realName={}, phone={}, email={}, departmentId={},roleIds={}",
+                updateDto.getUserId(), updateDto.getUserName(), updateDto.getRealName(), updateDto.getPhone(),
+                updateDto.getEmail(), updateDto.getDepartmentId(),updateDto.getRoleIds());
+        return systemService.updateUser(updateDto);
+    }
 
 
 /**

+ 34 - 0
alien-store/src/main/java/shop/alien/store/service/LifeSysUserRoleService.java

@@ -21,5 +21,39 @@ public interface LifeSysUserRoleService extends IService<LifeSysUserRole> {
      * @return boolean
      */
     boolean assignRoles(Integer userId, List<Long> roleIds);
+
+    /**
+     * 移除用户的所有角色
+     *
+     * @param userId 用户ID
+     * @return boolean
+     */
+    boolean removeAllRoles(Integer userId);
+
+    /**
+     * 根据用户ID获取角色ID列表
+     *
+     * @param userId 用户ID
+     * @return List<Long> 角色ID列表
+     */
+    List<Long> getRoleIdsByUserId(Integer userId);
+
+    /**
+     * 为用户添加单个角色
+     *
+     * @param userId 用户ID
+     * @param roleId 角色ID
+     * @return boolean
+     */
+    boolean addRole(Integer userId, Long roleId);
+
+    /**
+     * 移除用户的单个角色
+     *
+     * @param userId 用户ID
+     * @param roleId 角色ID
+     * @return boolean
+     */
+    boolean removeRole(Integer userId, Long roleId);
 }
 

+ 9 - 0
alien-store/src/main/java/shop/alien/store/service/SystemService.java

@@ -5,6 +5,7 @@ import shop.alien.entity.store.LifeSys;
 import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.entity.store.dto.SystemUserAddDto;
 import shop.alien.entity.store.dto.SystemUserStatusDto;
+import shop.alien.entity.store.dto.SystemUserUpdateDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
 
 /**
@@ -38,6 +39,14 @@ public interface SystemService {
     R<LifeSys> addUser(SystemUserAddDto addDto);
 
     /**
+     * 修改系统用户账号
+     *
+     * @param updateDto 修改用户信息
+     * @return R<LifeSys>
+     */
+    R<LifeSys> updateUser(SystemUserUpdateDto updateDto);
+
+    /**
      * 修改系统用户状态
      *
      * @param statusDto 用户状态信息

+ 81 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeSysUserRoleServiceImpl.java

@@ -10,7 +10,9 @@ import shop.alien.entity.store.LifeSysUserRole;
 import shop.alien.mapper.LifeSysUserRoleMapper;
 import shop.alien.store.service.LifeSysUserRoleService;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 用户角色关联表 服务实现类
@@ -61,5 +63,84 @@ public class LifeSysUserRoleServiceImpl extends ServiceImpl<LifeSysUserRoleMappe
         }
         return true;
     }
+
+    /**
+     * 移除用户的所有角色
+     *
+     * @param userId 用户ID
+     * @return boolean
+     */
+    public boolean removeAllRoles(Integer userId) {
+        if (userId == null) {
+            log.error("用户ID不能为空");
+            return false;
+        }
+
+        LambdaQueryWrapper<LifeSysUserRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSysUserRole::getUserId, userId);
+        int result = lifeSysUserRoleMapper.delete(queryWrapper);
+        return result >= 0; // 即使没有记录也返回true
+    }
+
+    @Override
+    public List<Long> getRoleIdsByUserId(Integer userId) {
+        if (userId == null) {
+            log.warn("用户ID为空,无法查询角色");
+            return new ArrayList<>();
+        }
+        LambdaQueryWrapper<LifeSysUserRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSysUserRole::getUserId, userId);
+        List<LifeSysUserRole> userRoles = lifeSysUserRoleMapper.selectList(queryWrapper);
+        return userRoles.stream()
+                .map(LifeSysUserRole::getRoleId)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean addRole(Integer userId, Long roleId) {
+        if (userId == null) {
+            log.error("用户ID不能为空");
+            return false;
+        }
+        if (roleId == null) {
+            log.error("角色ID不能为空");
+            return false;
+        }
+
+        // 检查是否已存在该关联关系
+        LambdaQueryWrapper<LifeSysUserRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSysUserRole::getUserId, userId)
+                .eq(LifeSysUserRole::getRoleId, roleId);
+        LifeSysUserRole existing = lifeSysUserRoleMapper.selectOne(queryWrapper);
+        if (existing != null) {
+            log.warn("用户ID={}已拥有角色ID={},无需重复添加", userId, roleId);
+            return true;
+        }
+
+        // 创建新的关联关系
+        LifeSysUserRole userRole = new LifeSysUserRole();
+        userRole.setUserId(userId);
+        userRole.setRoleId(roleId);
+        int result = lifeSysUserRoleMapper.insert(userRole);
+        return result > 0;
+    }
+
+    @Override
+    public boolean removeRole(Integer userId, Long roleId) {
+        if (userId == null) {
+            log.error("用户ID不能为空");
+            return false;
+        }
+        if (roleId == null) {
+            log.error("角色ID不能为空");
+            return false;
+        }
+
+        LambdaQueryWrapper<LifeSysUserRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(LifeSysUserRole::getUserId, userId)
+                .eq(LifeSysUserRole::getRoleId, roleId);
+        int result = lifeSysUserRoleMapper.delete(queryWrapper);
+        return result > 0;
+    }
 }
 

+ 128 - 1
alien-store/src/main/java/shop/alien/store/service/impl/SystemServiceImpl.java

@@ -12,9 +12,10 @@ import shop.alien.entity.store.LifeSys;
 import shop.alien.entity.store.UserLoginInfo;
 import shop.alien.entity.store.dto.SystemUserAddDto;
 import shop.alien.entity.store.dto.SystemUserStatusDto;
+import shop.alien.entity.store.dto.SystemUserUpdateDto;
 import shop.alien.entity.store.vo.SystemLoginVo;
-import shop.alien.store.config.BaseRedisService;
 import shop.alien.mapper.LifeSysMapper;
+import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.service.LifeSysUserRoleService;
 import shop.alien.store.service.SystemService;
 import shop.alien.util.common.JwtUtil;
@@ -25,6 +26,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -215,6 +217,131 @@ public class SystemServiceImpl implements SystemService {
     }
 
     @Override
+    public R<LifeSys> updateUser(SystemUserUpdateDto updateDto) {
+        // 校验用户ID
+        if (updateDto.getUserId() == null) {
+            return R.fail("用户ID不能为空");
+        }
+
+        // 查询用户是否存在
+        LifeSys lifeSys = lifeSysMapper.selectById(updateDto.getUserId());
+        if (lifeSys == null) {
+            return R.fail("用户不存在");
+        }
+
+        // 如果提供了用户名,校验用户名是否与其他用户重复
+        if (StringUtils.hasText(updateDto.getUserName()) && !updateDto.getUserName().equals(lifeSys.getUserName())) {
+            LambdaQueryWrapper<LifeSys> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(LifeSys::getUserName, updateDto.getUserName());
+            LifeSys existingUser = lifeSysMapper.selectOne(queryWrapper);
+            if (existingUser != null) {
+                return R.fail("该用户名已存在,请更换其他用户名");
+            }
+            lifeSys.setUserName(updateDto.getUserName());
+        }
+
+        // 如果提供了邮箱,校验邮箱是否与其他用户重复
+/*        if (StringUtils.hasText(updateDto.getEmail()) && !updateDto.getEmail().equals(lifeSys.getEmail())) {
+            LambdaQueryWrapper<LifeSys> emailQueryWrapper = new LambdaQueryWrapper<>();
+            emailQueryWrapper.eq(LifeSys::getEmail, updateDto.getEmail());
+            LifeSys existingEmail = lifeSysMapper.selectOne(emailQueryWrapper);
+            if (existingEmail != null) {
+                return R.fail("该邮箱已被使用,请更换其他邮箱");
+            }
+            lifeSys.setEmail(updateDto.getEmail());
+        }*/
+
+        // 更新其他字段(如果提供了)
+        if (StringUtils.hasText(updateDto.getRealName())) {
+            lifeSys.setRealName(updateDto.getRealName());
+        }
+        if (StringUtils.hasText(updateDto.getPhone())) {
+            lifeSys.setPhone(updateDto.getPhone());
+        }
+        if (StringUtils.hasText(updateDto.getPassword())) {
+            // 如果提供了密码,则更新密码
+            // lifeSys.setUserPassword(encryptToMD5(updateDto.getPassword()));
+            lifeSys.setUserPassword(updateDto.getPassword());
+        }
+        if (StringUtils.hasText(updateDto.getDepartmentId())) {
+            lifeSys.setDepartmentId(updateDto.getDepartmentId());
+        }
+        if (StringUtils.hasText(updateDto.getRemark())) {
+            lifeSys.setRemark(updateDto.getRemark());
+        }
+        if (updateDto.getStatus() != null) {
+            if (updateDto.getStatus() != 0 && updateDto.getStatus() != 1) {
+                return R.fail("状态值只能是0(禁用)或1(启用)");
+            }
+            lifeSys.setStatus(updateDto.getStatus());
+        }
+
+        // 保存用户信息
+        int result = lifeSysMapper.updateById(lifeSys);
+        if (result > 0) {
+            // 如果提供了角色ID列表,更新用户与角色的关系到中间表
+            if (StringUtils.hasText(updateDto.getRoleIds())) {
+                try {
+                    // 解析新的角色ID字符串(支持逗号分隔)
+                    Set<Long> newRoleIdSet = Arrays.stream(updateDto.getRoleIds().split(","))
+                            .map(String::trim)
+                            .filter(id -> !id.isEmpty())
+                            .map(Long::parseLong)
+                            .collect(Collectors.toSet());
+                    
+                    // 获取用户当前的角色ID列表
+                    List<Long> currentRoleIdList = lifeSysUserRoleService.getRoleIdsByUserId(lifeSys.getId());
+                    Set<Long> currentRoleIdSet = currentRoleIdList.stream().collect(Collectors.toSet());
+                    
+                    // 如果新角色列表为空,则删除所有角色关系
+                    if (newRoleIdSet.isEmpty()) {
+                        if (!currentRoleIdSet.isEmpty()) {
+                            lifeSysUserRoleService.removeAllRoles(lifeSys.getId());
+                        }
+                    } else {
+                        // 比较新旧角色列表,进行增量更新
+                        // 找出需要新增的角色(新列表中有,旧列表中没有)
+                        Set<Long> rolesToAdd = newRoleIdSet.stream()
+                                .filter(roleId -> !currentRoleIdSet.contains(roleId))
+                                .collect(Collectors.toSet());
+                        
+                        // 找出需要删除的角色(旧列表中有,新列表中没有)
+                        Set<Long> rolesToRemove = currentRoleIdSet.stream()
+                                .filter(roleId -> !newRoleIdSet.contains(roleId))
+                                .collect(Collectors.toSet());
+                        
+                        // 执行新增操作
+                        for (Long roleId : rolesToAdd) {
+                            lifeSysUserRoleService.addRole(lifeSys.getId(), roleId);
+                        }
+                        
+                        // 执行删除操作
+                        for (Long roleId : rolesToRemove) {
+                            lifeSysUserRoleService.removeRole(lifeSys.getId(), roleId);
+                        }
+                        
+                        // 如果没有任何变化,记录日志
+                        if (rolesToAdd.isEmpty() && rolesToRemove.isEmpty()) {
+                            log.info("用户ID={}的角色关系未发生变化,无需更新", lifeSys.getId());
+                        } else {
+                            log.info("用户ID={}的角色关系已更新:新增{}个角色,删除{}个角色", 
+                                    lifeSys.getId(), rolesToAdd.size(), rolesToRemove.size());
+                        }
+                    }
+                } catch (NumberFormatException e) {
+                    log.error("角色ID格式错误: {}", updateDto.getRoleIds(), e);
+                    return R.fail("角色ID格式错误,请检查后重试");
+                }
+            }
+            
+            // 清除密码信息,避免返回到前端
+            lifeSys.setUserPassword(null);
+            return R.data(lifeSys, "修改账号成功");
+        }
+        return R.fail("修改账号失败,请稍后重试");
+    }
+
+    @Override
     public R<LifeSys> updateUserStatus(SystemUserStatusDto statusDto) {
         // 校验用户ID
         if (statusDto.getUserId() == null) {