From 84486e0ba884e02f05ed7f8f4ce3f6c92b8082c3 Mon Sep 17 00:00:00 2001 From: xiang Date: Tue, 2 Sep 2025 23:08:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/api/dto/resp/PermissionDTO.java | 45 +++++++++++++++ .../xservice/auth/api/dto/resp/UserDTO.java | 18 ++++++ .../server/controller/TokenController.java | 8 +++ .../server/controller/UserController.java | 1 - xs-server/src/main/resources/application.yml | 2 +- .../service/convert/XPermissionConvert.java | 17 ++++++ .../xservice/auth/service/entity/XUser.java | 5 ++ .../repository/mapper/XPermissionMapper.java | 2 +- .../mapper/XRolePermissionMapper.java | 5 ++ .../repository/mapper/XUserDeptMapper.java | 3 + .../auth/service/service/XUserService.java | 3 + .../service/impl/XUserServiceImpl.java | 55 +++++++++++++++++++ .../resources/mapper/user/XDeptMapper.xml | 2 +- .../resources/mapper/user/XPermission.xml | 2 +- .../mapper/user/XRolePermissionMapper.xml | 14 ++++- .../resources/mapper/user/XUserDeptMapper.xml | 4 ++ 16 files changed, 178 insertions(+), 8 deletions(-) create mode 100644 xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/PermissionDTO.java create mode 100644 xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/UserDTO.java create mode 100644 xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XPermissionConvert.java diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/PermissionDTO.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/PermissionDTO.java new file mode 100644 index 0000000..8b1c40d --- /dev/null +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/PermissionDTO.java @@ -0,0 +1,45 @@ +package com.xiang.xservice.auth.api.dto.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PermissionDTO { + /** + * id + */ + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 编码 + */ + private String code; + + /** + * 类型 1=菜单 2=按钮 3=接口 + */ + private Integer type; + + /** + * 父类id + */ + private Long parentId; + + /** + * 路径接口 + */ + private String apiPath; + + /** + * 请求方法 + */ + private String method; +} diff --git a/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/UserDTO.java b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/UserDTO.java new file mode 100644 index 0000000..78d8990 --- /dev/null +++ b/xs-api/src/main/java/com/xiang/xservice/auth/api/dto/resp/UserDTO.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.auth.api.dto.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UserDTO { + + private List roles; + private UserResp user; + private DeptDTO dept; + private List permissionRoles; +} diff --git a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/TokenController.java b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/TokenController.java index 56f019d..6cb6596 100644 --- a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/TokenController.java +++ b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/TokenController.java @@ -5,11 +5,13 @@ import com.xiang.xservice.auth.api.dto.req.LoginRequest; import com.xiang.xservice.auth.api.dto.req.RegisterRequest; import com.xiang.xservice.auth.api.dto.resp.LoginResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp; +import com.xiang.xservice.auth.api.dto.resp.UserDTO; import com.xiang.xservice.auth.service.service.XUserService; import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.exception.BusinessException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -55,4 +57,10 @@ public class TokenController implements TokenApi { } return Result.error("操作失败"); } + + @GetMapping("/private/auth/getInfo") + public Result getUserInfo() { + // todo token的工具类,直接获取token中的userId无需传参 + return Result.success(userService.getUserDetail(1L)); + } } diff --git a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java index 97ec5c7..e662a72 100644 --- a/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java +++ b/xs-server/src/main/java/com/xiang/xservice/auth/server/controller/UserController.java @@ -12,7 +12,6 @@ import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.exception.BusinessException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; diff --git a/xs-server/src/main/resources/application.yml b/xs-server/src/main/resources/application.yml index ee76d94..43e29ae 100644 --- a/xs-server/src/main/resources/application.yml +++ b/xs-server/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 38011 spring: profiles: - active: test + active: local application: name: xservice-auth-center mvc: diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XPermissionConvert.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XPermissionConvert.java new file mode 100644 index 0000000..1b7450c --- /dev/null +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/convert/XPermissionConvert.java @@ -0,0 +1,17 @@ +package com.xiang.xservice.auth.service.convert; + +import com.xiang.xservice.auth.api.dto.resp.PermissionDTO; +import com.xiang.xservice.auth.service.entity.XPermission; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface XPermissionConvert { + XPermissionConvert INSTANCE = Mappers.getMapper(XPermissionConvert.class); + + PermissionDTO toDTO(XPermission permission); + List toDTOList(List permission); + +} diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XUser.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XUser.java index 22effa5..9b70be0 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XUser.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/entity/XUser.java @@ -21,6 +21,11 @@ public class XUser implements Serializable { */ private Long id; + /** + * 租户id + */ + private Long tenantId; + /** * 用户名(昵称) */ diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XPermissionMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XPermissionMapper.java index 36febb7..d7333f0 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XPermissionMapper.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XPermissionMapper.java @@ -14,7 +14,7 @@ public interface XPermissionMapper { List getPermissionList(XPermission permission); - List getPermissionByIds(@Param("id") List ids); + List getPermissionByIds(@Param("ids") List ids); XPermission getPermissionById(@Param("id") Long id); diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XRolePermissionMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XRolePermissionMapper.java index ac0ad4c..c4acfce 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XRolePermissionMapper.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XRolePermissionMapper.java @@ -1,11 +1,16 @@ package com.xiang.xservice.auth.service.repository.mapper; import com.xiang.xservice.auth.service.entity.XRolePermission; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; +@Repository +@Mapper public interface XRolePermissionMapper { List getRolePermissionsByRoleId(@Param("roleId") Long roleId); + List getRolePermissionsByRoleIds(@Param("roleIds") List roleIds); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserDeptMapper.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserDeptMapper.java index 5841359..6d1992e 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserDeptMapper.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/repository/mapper/XUserDeptMapper.java @@ -2,6 +2,7 @@ package com.xiang.xservice.auth.service.repository.mapper; import com.xiang.xservice.auth.service.entity.XUserDept; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -16,4 +17,6 @@ public interface XUserDeptMapper { int addBatch(List list); int delByDeptId(Long deptId); + + XUserDept getByUserId(@Param("id") Long userId); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java index ae04c54..a559a96 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/XUserService.java @@ -9,6 +9,7 @@ import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; import com.xiang.xservice.auth.api.dto.resp.LoginResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp; +import com.xiang.xservice.auth.api.dto.resp.UserDTO; import com.xiang.xservice.auth.api.dto.resp.UserResp; import java.util.List; @@ -34,4 +35,6 @@ public interface XUserService { Boolean setUserDept(UserDeptUpdateRequest request); Boolean setUserRole(UserRoleUpdateRequest request); + + UserDTO getUserDetail(Long userId); } diff --git a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java index 66cdb64..a45117b 100644 --- a/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java +++ b/xs-service/src/main/java/com/xiang/xservice/auth/service/service/impl/XUserServiceImpl.java @@ -3,6 +3,7 @@ package com.xiang.xservice.auth.service.service.impl; import com.google.common.collect.Lists; import com.xiang.xservice.auth.api.code.Code01UserErrorCode; import com.xiang.xservice.auth.api.code.Code02RoleErrorCode; +import com.xiang.xservice.auth.api.code.Code03DeptErrorCode; import com.xiang.xservice.auth.api.dto.req.LoginRequest; import com.xiang.xservice.auth.api.dto.req.RegisterRequest; import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest; @@ -12,13 +13,25 @@ import com.xiang.xservice.auth.api.dto.req.user.UserRoleUpdateRequest; import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest; import com.xiang.xservice.auth.api.dto.resp.LoginResp; import com.xiang.xservice.auth.api.dto.resp.RegisterResp; +import com.xiang.xservice.auth.api.dto.resp.UserDTO; import com.xiang.xservice.auth.api.dto.resp.UserResp; +import com.xiang.xservice.auth.service.convert.XDeptConvert; +import com.xiang.xservice.auth.service.convert.XPermissionConvert; +import com.xiang.xservice.auth.service.convert.XRoleConvert; import com.xiang.xservice.auth.service.convert.XUserConvert; +import com.xiang.xservice.auth.service.entity.XDept; +import com.xiang.xservice.auth.service.entity.XPermission; import com.xiang.xservice.auth.service.entity.XRole; +import com.xiang.xservice.auth.service.entity.XRolePermission; import com.xiang.xservice.auth.service.entity.XUser; +import com.xiang.xservice.auth.service.entity.XUserDept; import com.xiang.xservice.auth.service.entity.XUserRole; import com.xiang.xservice.auth.service.enums.UserStatusEnum; +import com.xiang.xservice.auth.service.repository.mapper.XDeptMapper; +import com.xiang.xservice.auth.service.repository.mapper.XPermissionMapper; import com.xiang.xservice.auth.service.repository.mapper.XRoleMapper; +import com.xiang.xservice.auth.service.repository.mapper.XRolePermissionMapper; +import com.xiang.xservice.auth.service.repository.mapper.XUserDeptMapper; import com.xiang.xservice.auth.service.repository.mapper.XUserMapper; import com.xiang.xservice.auth.service.repository.mapper.XUserRoleMapper; import com.xiang.xservice.auth.service.service.XUserService; @@ -57,6 +70,13 @@ public class XUserServiceImpl implements XUserService { private final XUserConvert userConvert; private final XRoleMapper roleMapper; private final XUserRoleMapper userRoleMapper; + private final XRoleConvert roleConvert; + private final XDeptMapper deptMapper; + private final XUserDeptMapper userDeptMapper; + private final XDeptConvert deptConvert; + private final XRolePermissionMapper rolePermissionMapper; + private final XPermissionMapper permissionMapper; + private final XPermissionConvert permissionConvert; @Override public LoginResp login(LoginRequest request) { @@ -91,6 +111,8 @@ public class XUserServiceImpl implements XUserService { .issuedAt(now) .expiresAt(now.plus(3, ChronoUnit.HOURS)) // 自定义 scope + .claim("userId", user.getId()) + .claim("tenantId", user.getTenantId()) .claim("timestamp", System.currentTimeMillis()) .claim("username", request.getUsername()) .claim("authorities", roleCodes) @@ -222,4 +244,37 @@ public class XUserServiceImpl implements XUserService { } return Boolean.FALSE; } + + @Override + public UserDTO getUserDetail(Long userId) { + UserDTO dto = new UserDTO(); + XUser user = userMapper.getUserById(userId); + if (Objects.isNull(user)) { + throw new BusinessException(Code01UserErrorCode.USER_NOT_EXISTS); + } + dto.setUser(userConvert.toResp(user)); + List userRoles = userRoleMapper.getByUserId(userId); + List roleIds = userRoles.stream().map(XUserRole::getRoleId).toList(); + List roles = roleMapper.getRoleByIds(roleIds); + if (CollectionUtils.isEmpty(roles)) { + throw new BusinessException(Code02RoleErrorCode.ROLE_NOT_EXISTS); + } + dto.setRoles(roleConvert.toDTOList(roles)); + XUserDept userDept = userDeptMapper.getByUserId(userId); + if (Objects.nonNull(userDept)) { + Long deptId = userDept.getDeptId(); + XDept dept = deptMapper.getDeptById(deptId); + if (Objects.isNull(dept)) { + throw new BusinessException(Code03DeptErrorCode.DEPT_NOT_EXISTS); + } + dto.setDept(deptConvert.toDTO(dept)); + } + List permissionsByRoleIds = rolePermissionMapper.getRolePermissionsByRoleIds(roleIds); + if (CollectionUtils.isNotEmpty(permissionsByRoleIds)) { + List permissionIds = permissionsByRoleIds.stream().map(XRolePermission::getPermissionId).toList(); + List permissions = permissionMapper.getPermissionByIds(permissionIds); + dto.setPermissionRoles(permissionConvert.toDTOList(permissions)); + } + return dto; + } } diff --git a/xs-service/src/main/resources/mapper/user/XDeptMapper.xml b/xs-service/src/main/resources/mapper/user/XDeptMapper.xml index b3eac96..3c81afa 100644 --- a/xs-service/src/main/resources/mapper/user/XDeptMapper.xml +++ b/xs-service/src/main/resources/mapper/user/XDeptMapper.xml @@ -3,7 +3,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + diff --git a/xs-service/src/main/resources/mapper/user/XPermission.xml b/xs-service/src/main/resources/mapper/user/XPermission.xml index 5da7da7..08bb6ac 100644 --- a/xs-service/src/main/resources/mapper/user/XPermission.xml +++ b/xs-service/src/main/resources/mapper/user/XPermission.xml @@ -171,7 +171,7 @@ select from x_permission where id in - + #{id} diff --git a/xs-service/src/main/resources/mapper/user/XRolePermissionMapper.xml b/xs-service/src/main/resources/mapper/user/XRolePermissionMapper.xml index f8d8fb6..3d6d4cb 100644 --- a/xs-service/src/main/resources/mapper/user/XRolePermissionMapper.xml +++ b/xs-service/src/main/resources/mapper/user/XRolePermissionMapper.xml @@ -9,13 +9,21 @@ - role_id, - permission_id + `role_id`, + `permission_id` + diff --git a/xs-service/src/main/resources/mapper/user/XUserDeptMapper.xml b/xs-service/src/main/resources/mapper/user/XUserDeptMapper.xml index df1cb1e..9b5526e 100644 --- a/xs-service/src/main/resources/mapper/user/XUserDeptMapper.xml +++ b/xs-service/src/main/resources/mapper/user/XUserDeptMapper.xml @@ -21,6 +21,10 @@ delete from x_user_data_scope_dept where dept_id = #{deptId} + \ No newline at end of file