xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpOperationsRoleMapper.java
@@ -38,4 +38,12 @@ @Param("phoneNumber") String phoneNumber, @Param("roleId") Long roleId ); /** * 根据用户ID查询用户及角色信息 * * @param userId 用户ID * @return 用户及角色信息列表 */ List<XpOperationsRole> selectSysUserRoleByOperationUserId(@Param("userId")Long userId); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysPermissionService.java
@@ -1,6 +1,7 @@ package com.xiaopeng.account.service; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.model.operation.SysMenu; import java.util.List; @@ -20,6 +21,12 @@ * @return 角色权限信息 */ Set<String> getRolePermission(SysUser user); /** * 获取运维角色数据权限 * * @return 角色权限信息 */ Set<String> getRolePermission(XpOperationsUser user); /** * 获取菜单数据权限 @@ -27,4 +34,10 @@ * @return 菜单权限信息 */ Set<String> getMenuPermission(SysUser user); /** * 获取运维菜单数据权限 * * @return 菜单权限信息 */ Set<String> getMenuPermission(XpOperationsUser user); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/ISysRoleService.java
@@ -9,6 +9,7 @@ import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.common.core.web.page.PageInfo; import java.util.Collection; import java.util.Set; /** @@ -90,4 +91,11 @@ * @return */ Boolean checkMenuExistRole(Long menuId); /** * 根据操作用户ID查询权限 * @param id * @return */ Set<String> selectRolePermissionByOperationUserId(Long id); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysLoginService.java
@@ -166,6 +166,13 @@ } passwordService.validateOperationsUser(operationsUser, password, request); loginOperationUser.setXpOperationsUser(operationsUser); // 查询用户角色 // 角色集合 Set<String> roles = permissionService.getRolePermission(operationsUser); // 权限集合 Set<String> menuPermission = permissionService.getMenuPermission(operationsUser); loginOperationUser.setRoles(roles); loginOperationUser.setPermissions(menuPermission); //更新用户登录设备类型 operationsUser.setDeviceType(deviceType); operationsUserService.updateById(operationsUser); xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysPermissionServiceImpl.java
@@ -6,19 +6,21 @@ import java.util.Set; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.xiaopeng.account.mapper.XpOperationsRoleMapper; import com.xiaopeng.account.service.ISysGroupMenuService; import com.xiaopeng.account.service.ISysPermissionService; import com.xiaopeng.account.service.ISysRoleService; import com.xiaopeng.account.service.ISysUserRoleService; import com.xiaopeng.api.feignClient.operation.SysMenuClient; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.account.SysUserRole; import com.xiaopeng.api.model.account.*; import com.xiaopeng.api.model.operation.SysMenu; import com.xiaopeng.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; /** * 用户权限处理 @@ -41,7 +43,8 @@ @Autowired private SysMenuClient sysMenuClient; @Autowired private XpOperationsRoleMapper xpOperationsRoleMapper; /** * 获取角色数据权限 * @@ -61,6 +64,14 @@ { roles.addAll(roleService.selectRolePermissionByUserId(user.getId())); } return roles; } @Override public Set<String> getRolePermission(XpOperationsUser user) { Set<String> roles = new HashSet<String>(); // 管理员拥有所有权限 roles.addAll(roleService.selectRolePermissionByOperationUserId(user.getId())); return roles; } @@ -121,4 +132,48 @@ return perms; } @Override public Set<String> getMenuPermission(XpOperationsUser user) { Set<String> perms = new HashSet<>(); try { // 1. 根据 userId 查询 sys_user_role 获取 roleId List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper.selectSysUserRoleByOperationUserId(user.getId()); if (CollectionUtils.isEmpty(xpOperationsRoles)) { log.warn("用户[{}]未分配角色", user.getId()); return perms; } List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList()); // 2. 根据 roleId 查询 sys_role 获取 groupId List<SysRole> sysRoles = roleService.list(Wrappers.lambdaQuery(SysRole.class) .in(SysRole::getId, roleIds)); List<Long> groupIds = sysRoles.stream().map(SysRole::getGroupId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(groupIds)) { log.warn("角色[{}]未关联权限组", groupIds); return perms; } // 3. 根据 groupId 查询 sys_group_menu 获取 menuId 列表 List<SysGroupMenu> sysGroupMenus = groupMenuService.list(Wrappers.lambdaQuery(SysGroupMenu.class) .in(SysGroupMenu::getGroupId, groupIds)); List<Long> menuIds = sysGroupMenus.stream().map(SysGroupMenu::getMenuId).collect(Collectors.toList()); if (CollectionUtils.isEmpty(menuIds)) { log.warn("权限组[{}]未配置菜单权限", menuIds); return perms; } // 4. 通过 Feign 调用 operation 服务,根据 menuId 列表获取菜单列表 R<List<SysMenu>> result = sysMenuClient.getMenusByMenuIds(menuIds); if (R.isSuccess(result) && result.getData() != null) { perms = result.getData().stream().map(item -> item.getId().toString()).collect(Collectors.toSet()); } else { log.error("调用菜单服务获取菜单列表失败: {}", result != null ? result.getMsg() : "返回结果为空"); } } catch (Exception e) { log.error("获取用户[{}]菜单权限异常", user.getId(), e); } return perms; } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/SysRoleServiceImpl.java
@@ -2,10 +2,12 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.account.constant.I18nKeyConstant; import com.xiaopeng.account.mapper.SysRoleMapper; import com.xiaopeng.account.mapper.SysRoleMenuMapper; import com.xiaopeng.account.mapper.XpOperationsRoleMapper; import com.xiaopeng.account.model.dto.SysRoleAddDTO; import com.xiaopeng.account.model.dto.SysRoleEditDTO; import com.xiaopeng.account.model.query.SysRolePageQuery; @@ -18,6 +20,7 @@ import com.xiaopeng.api.feignClient.operation.SysMenuClient; import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.api.model.account.SysUserRole; import com.xiaopeng.api.model.account.XpOperationsRole; import com.xiaopeng.api.model.operation.SysMenu; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; @@ -53,6 +56,7 @@ private final SysMenuClient sysMenuClient; private final SysRoleMenuMapper sysRoleMenuMapper; private final XpOperationsRoleMapper xpOperationsRoleMapper; /** * 根据角色ID查询权限组ID @@ -342,4 +346,32 @@ public Boolean checkMenuExistRole(Long menuId) { return sysRoleMenuMapper.checkMenuExistRole(menuId) > 0; } @Override public Set<String> selectRolePermissionByOperationUserId(Long userId) { Set<String> roles = new HashSet<>(); if (userId == null) { return roles; } // 查询用户关联的角色 List<XpOperationsRole> xpOperationsRoles = xpOperationsRoleMapper.selectSysUserRoleByOperationUserId(userId); if (CollectionUtils.isEmpty(xpOperationsRoles)) { return roles; } // 查询角色信息 List<Long> roleIds = xpOperationsRoles.stream().map(XpOperationsRole::getRoleId).collect(Collectors.toList()); List<SysRole> roleList= this.list(Wrappers.lambdaQuery(SysRole.class) .in(SysRole::getId, roleIds)); if (!CollectionUtils.isEmpty(roleList)) { roleList.forEach(role -> { if (role != null) { roles.add(role.getRoleName()); } }); } return roles; } } xp-robotaxi-account-boot/src/main/resources/mapper/account/XpOperationsRoleMapper.xml
@@ -42,5 +42,13 @@ AND r.id = #{roleId} </if> </select> <select id="selectSysUserRoleByOperationUserId" resultType="com.xiaopeng.api.model.account.XpOperationsRole"> SELECT ur.operations_user_id AS operationsUserId, ur.role_id AS roleId FROM xp_operations_role ur WHERE ur.operations_user_id = #{operationsUserId} </select> </mapper>