diff --git a/das/src/main/java/com/das/common/interceptor/FilterConfig.java b/das/src/main/java/com/das/common/interceptor/FilterConfig.java index cc1d2099..eb66a8b0 100644 --- a/das/src/main/java/com/das/common/interceptor/FilterConfig.java +++ b/das/src/main/java/com/das/common/interceptor/FilterConfig.java @@ -22,7 +22,7 @@ public class FilterConfig { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); //注册过滤器 registrationBean.setFilter(new DecryptingOncePerRequestFilter(aesProperties.getKey())); - registrationBean.addUrlPatterns("/api/*"); // 设置过滤器应用的URL模式 + registrationBean.addUrlPatterns("/api/at"); // 设置过滤器应用的URL模式 registrationBean.setOrder(2); // 设置过滤器的顺序 return registrationBean; } diff --git a/das/src/main/java/com/das/modules/auth/controller/SysUserController.java b/das/src/main/java/com/das/modules/auth/controller/SysUserController.java index 0d4f25e3..c8d22fea 100644 --- a/das/src/main/java/com/das/modules/auth/controller/SysUserController.java +++ b/das/src/main/java/com/das/modules/auth/controller/SysUserController.java @@ -6,6 +6,7 @@ import com.das.common.utils.PageQuery; import com.das.modules.auth.domain.dto.DeleteDto; import com.das.modules.auth.domain.dto.SysUserDto; import com.das.modules.auth.domain.dto.SysUserQueryDto; +import com.das.modules.auth.domain.vo.SysUserVo; import com.das.modules.auth.entity.SysUser; import com.das.modules.auth.service.SysUserService; import lombok.extern.slf4j.Slf4j; @@ -56,7 +57,7 @@ public class SysUserController { } @PostMapping("/query") - public PageDataInfo queryUserList(@RequestBody SysUserQueryDto sysUserQueryDto, PageQuery pageQuery) { + public PageDataInfo queryUserList(@RequestBody SysUserQueryDto sysUserQueryDto, PageQuery pageQuery) { return sysUserService.queryUserList(sysUserQueryDto, pageQuery); } } diff --git a/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDto.java b/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDto.java index 20608cd0..8ade0317 100644 --- a/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDto.java +++ b/das/src/main/java/com/das/modules/auth/domain/dto/SysUserDto.java @@ -4,33 +4,48 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; +import java.util.List; @Data public class SysUserDto implements Serializable { - /** 角色ID */ - private Long id ; - /** 账号 */ - private String account ; - /** 密码 */ - private String password ; - /** 职员名称 */ - private String userName ; - /** 职员邮箱 */ - private String email ; - /** 手机号 */ - private String phone ; - /** 所属机构id */ - private Long orgId ; - /** 最后登录时间 */ - private Date lastLogin ; - /** 乐观锁 */ - private Integer revision ; - /** 创建人 */ - private String createdBy ; - /** 创建时间 */ - private Date createdTime ; - /** 更新人 */ - private String updatedBy ; - /** 更新时间 */ - private Date updatedTime ; - } + /** + * 角色ID + */ + private Long id; + /** + * 账号 + */ + private String account; + /** + * 密码 + */ + private String password; + /** + * 职员名称 + */ + private String userName; + /** + * 职员邮箱 + */ + private String email; + /** + * 手机号 + */ + private String phone; + /** + * 所属机构id + */ + private Long orgId; + /** + * 最后登录时间 + */ + private Date lastLogin; + /** + * 乐观锁 + */ + private Integer revision; + /** + * 角色列表 + */ + private List roleList; +} diff --git a/das/src/main/java/com/das/modules/auth/domain/vo/SysUserRoleVo.java b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserRoleVo.java new file mode 100644 index 00000000..3696d060 --- /dev/null +++ b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserRoleVo.java @@ -0,0 +1,38 @@ +package com.das.modules.auth.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 账号信息 + * + * @author guchengwei + */ +@Data +public class SysUserRoleVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + /** + * 账号ID + */ + private Long id; + + /** + * 角色编码 + */ + private String roleCode; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 版本号 + */ + private Integer revision; + + +} diff --git a/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java index 3feb73c6..01e7e11d 100644 --- a/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java +++ b/das/src/main/java/com/das/modules/auth/domain/vo/SysUserVo.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 账号信息 @@ -29,6 +30,12 @@ public class SysUserVo implements Serializable { */ private String userName; + + /** + * 乐观锁 + */ + private Integer revision; + /** * 手机号 */ @@ -45,5 +52,10 @@ public class SysUserVo implements Serializable { */ private Long orgId; + /** + * 角色列表 + */ + private List roleList; + } diff --git a/das/src/main/java/com/das/modules/auth/entity/SysUserRole.java b/das/src/main/java/com/das/modules/auth/entity/SysUserRole.java new file mode 100644 index 00000000..b5fa43ce --- /dev/null +++ b/das/src/main/java/com/das/modules/auth/entity/SysUserRole.java @@ -0,0 +1,57 @@ +package com.das.modules.auth.entity; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.das.common.constant.BaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * (sys_r_role_authority)实体类 + * + * @author chenhaojie + * @since 2024-06-25 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_r_user_role") +public class SysUserRole extends BaseEntity implements Serializable { + /** + * 主键 + */ + @TableId("id") + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** + * 用户id + */ + @TableField("user_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long userId; + + /** + * 角色id + */ + @TableField("role_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long roleId; + + /** + * 乐观锁 + */ + @Version + @TableField("revision") + private Integer revision; +} diff --git a/das/src/main/java/com/das/modules/auth/mapper/SysRoleMapper.java b/das/src/main/java/com/das/modules/auth/mapper/SysRoleMapper.java index 51a707b2..1855d196 100644 --- a/das/src/main/java/com/das/modules/auth/mapper/SysRoleMapper.java +++ b/das/src/main/java/com/das/modules/auth/mapper/SysRoleMapper.java @@ -32,5 +32,7 @@ public interface SysRoleMapper extends BaseMapper { SysRole selectByCode(@Param("roleCode") String roleCode); + long existRoleByRoleId(@Param("id")Long id); + long existRoleByName(@Param("name") String name); } diff --git a/das/src/main/java/com/das/modules/auth/mapper/SysUserMapper.java b/das/src/main/java/com/das/modules/auth/mapper/SysUserMapper.java index 20aa8bfd..4965accf 100644 --- a/das/src/main/java/com/das/modules/auth/mapper/SysUserMapper.java +++ b/das/src/main/java/com/das/modules/auth/mapper/SysUserMapper.java @@ -2,6 +2,7 @@ package com.das.modules.auth.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.das.modules.auth.domain.dto.SysUserQueryDto; +import com.das.modules.auth.domain.vo.SysUserVo; import com.das.modules.auth.entity.SysUser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -14,5 +15,15 @@ import org.apache.ibatis.annotations.Param; * @author chenhaojie */ public interface SysUserMapper extends BaseMapper { - IPage queryUserList(IPage page, @Param("sysUser") SysUserQueryDto sysUserQueryDto); + + /** + * 判断用户是否存在 + * + * @param account 用户账号 + * @return 0 - 不存在 1 - 存在 + */ + long existUserByAccount(@Param("account") String account); + IPage queryUserList(IPage page, @Param("sysUser") SysUserQueryDto sysUserQueryDto); + + long existUserByUserName(@Param("userName") String userName); } diff --git a/das/src/main/java/com/das/modules/auth/mapper/SysUserRoleMapper.java b/das/src/main/java/com/das/modules/auth/mapper/SysUserRoleMapper.java new file mode 100644 index 00000000..c5876cb8 --- /dev/null +++ b/das/src/main/java/com/das/modules/auth/mapper/SysUserRoleMapper.java @@ -0,0 +1,18 @@ +package com.das.modules.auth.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.das.modules.auth.entity.SysRoleAuthority; +import com.das.modules.auth.entity.SysUserRole; + + +/** + *

+ * 用户信息 Mapper 接口 + *

+ * + * @author chenhaojie + */ +public interface SysUserRoleMapper extends BaseMapper { + + +} diff --git a/das/src/main/java/com/das/modules/auth/service/SysUserService.java b/das/src/main/java/com/das/modules/auth/service/SysUserService.java index f2498b33..0bf4c4e2 100644 --- a/das/src/main/java/com/das/modules/auth/service/SysUserService.java +++ b/das/src/main/java/com/das/modules/auth/service/SysUserService.java @@ -5,14 +5,15 @@ import com.das.common.utils.PageQuery; import com.das.modules.auth.domain.dto.DeleteDto; import com.das.modules.auth.domain.dto.SysUserDto; import com.das.modules.auth.domain.dto.SysUserQueryDto; +import com.das.modules.auth.domain.vo.SysUserVo; import com.das.modules.auth.entity.SysUser; public interface SysUserService { - SysUser createUser(SysUserDto sysUserDto); + SysUserDto createUser(SysUserDto sysUserDto); - void updateUser(SysUserDto sysUserDto); + SysUserDto updateUser(SysUserDto sysUserDto); void deleteUser(DeleteDto deleteDto); - PageDataInfo queryUserList(SysUserQueryDto sysUserQueryDto, PageQuery pageQuery); + PageDataInfo queryUserList(SysUserQueryDto sysUserQueryDto, PageQuery pageQuery); } diff --git a/das/src/main/java/com/das/modules/auth/service/impl/SysUserServiceImpl.java b/das/src/main/java/com/das/modules/auth/service/impl/SysUserServiceImpl.java index 169b0869..dcf3668d 100644 --- a/das/src/main/java/com/das/modules/auth/service/impl/SysUserServiceImpl.java +++ b/das/src/main/java/com/das/modules/auth/service/impl/SysUserServiceImpl.java @@ -1,7 +1,9 @@ package com.das.modules.auth.service.impl; import cn.dev33.satoken.secure.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.das.common.exceptions.ServiceException; import com.das.common.utils.BeanCopyUtils; import com.das.common.utils.SequenceUtils; import com.das.common.utils.PageDataInfo; @@ -9,21 +11,50 @@ import com.das.common.utils.PageQuery; import com.das.modules.auth.domain.dto.DeleteDto; import com.das.modules.auth.domain.dto.SysUserDto; import com.das.modules.auth.domain.dto.SysUserQueryDto; +import com.das.modules.auth.domain.vo.SysUserVo; +import com.das.modules.auth.entity.SysRole; +import com.das.modules.auth.entity.SysRoleAuthority; import com.das.modules.auth.entity.SysUser; +import com.das.modules.auth.entity.SysUserRole; +import com.das.modules.auth.mapper.SysRoleMapper; import com.das.modules.auth.mapper.SysUserMapper; +import com.das.modules.auth.mapper.SysUserRoleMapper; import com.das.modules.auth.service.SysUserService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Service public class SysUserServiceImpl implements SysUserService { + private static final ObjectMapper JSON_MAPPER = new ObjectMapper(); + + @Autowired SysUserMapper sysUserMapper; + + @Autowired + SysRoleMapper sysRoleMapper; + + @Autowired + SysUserRoleMapper sysUserRoleMapper; + @Override - public SysUser createUser(SysUserDto sysUserDto) { + public SysUserDto createUser(SysUserDto sysUserDto) { + + //根据账号account判断是否存在 + long roleCount = sysUserMapper.existUserByAccount(sysUserDto.getAccount()); + if (roleCount > 0) { + throw new ServiceException(String.format("账号 %s 已存在", sysUserDto.getAccount())); + } + SysUser sysUser = new SysUser(); BeanCopyUtils.copy(sysUserDto,sysUser); //密码加密 @@ -34,24 +65,129 @@ public class SysUserServiceImpl implements SysUserService { sysUser.setUpdatedTime(new Date()); sysUser.setPassword(passwordEncode); sysUserMapper.insert(sysUser); - return sysUser; + + if (sysUserDto.getRoleList() != null && sysUserDto.getRoleList().size() > 0) { + //验证角色有效性 + String errorRoles = checkErrorRole(sysUserDto.getRoleList()); + if (StringUtils.hasText(errorRoles)) { + throw new ServiceException("角色不存在 " + errorRoles); + } + //解锁role与Account绑定 + QueryWrapper accountRoleQueryWrapper = new QueryWrapper<>(); + accountRoleQueryWrapper.eq("user_id",sysUser.getId()); + sysUserRoleMapper.delete(accountRoleQueryWrapper); + //绑定角色 + for (Long roleId : sysUserDto.getRoleList()) { + SysUserRole accountRole = new SysUserRole(); + accountRole.setUserId(sysUser.getId()); + accountRole.setRoleId(roleId); + accountRole.setRevision(1); + accountRole.setCreatedTime(new Date()); + accountRole.setUpdatedTime(new Date()); + sysUserRoleMapper.insert(accountRole); + } + } + // 消除密码 + sysUserDto.setPassword(null); + return sysUserDto; + } + + /** + * 验证角色是否存在 + */ + private String checkErrorRole(List roles) { + if (roles != null && roles.size() > 0) { + List errorRole = new ArrayList<>(); + for (Long roleId : roles) { + if (roleId == null) { + continue; + } + long roleCount = sysRoleMapper.existRoleByRoleId(roleId); + if (roleCount == 0) { + errorRole.add(roleId); + } + } + if (errorRole.size() > 0) { + try { + return JSON_MAPPER.writeValueAsString(errorRole); + } catch (JsonProcessingException e) { + return null; + } + } + } + return null; } @Override - public void updateUser(SysUserDto sysUserDto) { - SysUser sysUser = new SysUser(); - BeanCopyUtils.copy(sysUserDto,sysUser); - sysUserMapper.updateById(sysUser); + public SysUserDto updateUser(SysUserDto sysUserDto) { + if (sysUserDto.getId() == null) { + throw new ServiceException("参数缺失"); + } + + SysUser sysUser = sysUserMapper.selectById(sysUserDto.getId()); + if (sysUser == null) { + throw new ServiceException(String.format("账号 %d 不存在", sysUserDto.getId())); + } + if (StringUtils.hasText(sysUserDto.getUserName())) { + //若与数据库中账户名相同 则表示未对名称进行修改 + if (!sysUser.getUserName().equals(sysUserDto.getUserName())) { + //判断账户名是否存在 + long userCount = sysUserMapper.existUserByUserName(sysUserDto.getUserName()); + if (userCount > 0) { + throw new ServiceException(String.format("账户名 %s 已存在", sysUserDto.getUserName())); + } + } + } + SysUser newSysUser = new SysUser(); + BeanUtils.copyProperties(sysUserDto, newSysUser, "password"); + sysUserMapper.updateById(newSysUser); + + if (sysUserDto.getRoleList() != null) { + //验证角色有效性 + String errorRoles = checkErrorRole(sysUserDto.getRoleList()); + if (StringUtils.hasText(errorRoles)) { + throw new ServiceException("角色不存在 " + errorRoles); + } + //解锁role与Account绑定 + QueryWrapper accountRoleQueryWrapper = new QueryWrapper<>(); + accountRoleQueryWrapper.eq("user_id",newSysUser.getId()); + sysUserRoleMapper.delete(accountRoleQueryWrapper); + //绑定角色 + for (Long roleId : sysUserDto.getRoleList()) { + + SysUserRole accountRole = new SysUserRole(); + accountRole.setUserId(sysUser.getId()); + accountRole.setRoleId(roleId); + accountRole.setRevision(1); + accountRole.setCreatedTime(new Date()); + accountRole.setUpdatedTime(new Date()); + sysUserRoleMapper.insert(accountRole); + } + } + return sysUserDto; } @Override public void deleteUser(DeleteDto deleteDto) { + if (StringUtils.isEmpty(deleteDto.getId())) { + throw new ServiceException("参数缺失"); + } + SysUser sysUser = sysUserMapper.selectById(deleteDto.getId()); + if (sysUser == null) { + throw new ServiceException("账号不存在"); + } + + //解锁role与用户绑定 + QueryWrapper accountRoleQueryWrapper = new QueryWrapper<>(); + accountRoleQueryWrapper.eq("user_id", deleteDto.getId()); + this.sysUserRoleMapper.delete(accountRoleQueryWrapper); + //删除角色 sysUserMapper.deleteById(deleteDto.getId()); } @Override - public PageDataInfo queryUserList(SysUserQueryDto sysUserQueryDto, PageQuery pageQuery) { - IPage iPage = sysUserMapper.queryUserList(pageQuery.build(), sysUserQueryDto); + public PageDataInfo queryUserList(SysUserQueryDto sysUserQueryDto, PageQuery pageQuery) { + IPage iPage = sysUserMapper.queryUserList(pageQuery.build(), sysUserQueryDto); return PageDataInfo.build(iPage.getRecords(), iPage.getTotal()); } } diff --git a/das/src/main/resources/mapper/SysRoleMapper.xml b/das/src/main/resources/mapper/SysRoleMapper.xml index d25dd665..9ede2958 100644 --- a/das/src/main/resources/mapper/SysRoleMapper.xml +++ b/das/src/main/resources/mapper/SysRoleMapper.xml @@ -35,6 +35,10 @@ select count(1) from sys_role t where t.role_code=#{roleCode} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +