From f5aa6b2f6967164fe9fa7eb60367d9e142d93295 Mon Sep 17 00:00:00 2001 From: ailanyin Date: Mon, 22 May 2023 20:14:18 +0800 Subject: [PATCH] first commit --- .../qiaoba/auth/aspectj/DataScopeAspect.java | 13 ++-- .../com/qiaoba/auth/entity/LoginUser.java | 3 +- .../com/qiaoba/auth/entity/SecurityUser.java | 9 ++- .../com/qiaoba/auth/entity/dto/RoleDto.java | 1 + .../common/base/context/BaseContext.java | 68 +++++++++++++++---- .../common/base}/enums/DataBaseTypeEnum.java | 3 +- .../common/base}/utils/DatabaseUtil.java | 32 +++------ .../qiaoba/common/base/utils/TenantUtil.java | 30 -------- .../config/DynamicDataSourceContext.java | 26 +------ .../database/config/MybatisPlusConfig.java | 4 +- .../filters/DynamicDataSourceFilter.java | 25 ++++--- .../interceptors/SchemaInterceptor.java | 25 +++++++ .../redis/service/impl/RedisServiceImpl.java | 4 +- .../system/mapper/SysUserRoleMapper.java | 28 +++----- .../system/service/SysUserRoleService.java | 15 ++-- .../impl/SysUserDetailsServiceImpl.java | 9 ++- .../service/impl/SysUserRoleServiceImpl.java | 17 +++-- .../resources/mapper/SysUserRoleMapper.xml | 13 +--- 18 files changed, 158 insertions(+), 167 deletions(-) rename qiaoba-commons/{qiaoba-common-datasource/src/main/java/com/qiaoba/common/database => qiaoba-common-base/src/main/java/com/qiaoba/common/base}/enums/DataBaseTypeEnum.java (95%) rename qiaoba-commons/{qiaoba-common-datasource/src/main/java/com/qiaoba/common/database => qiaoba-common-base/src/main/java/com/qiaoba/common/base}/utils/DatabaseUtil.java (52%) delete mode 100644 qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/TenantUtil.java create mode 100644 qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/aspectj/DataScopeAspect.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/aspectj/DataScopeAspect.java index 9fdbafe..b3a948e 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/aspectj/DataScopeAspect.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/aspectj/DataScopeAspect.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.qiaoba.auth.annotation.DataScope; import com.qiaoba.auth.entity.LoginUser; import com.qiaoba.auth.entity.dto.RoleDto; +import com.qiaoba.common.base.utils.DatabaseUtil; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -59,10 +60,10 @@ public class DataScopeAspect { /** * 数据范围过滤 * - * @param joinPoint 切点 - * @param user 用户 - * @param deptAlias 部门别名 - * @param userAlias 用户别名 + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 */ public static void dataScopeFilter(JoinPoint joinPoint, LoginUser user, String deptAlias, String userAlias) { StringBuilder sqlString = new StringBuilder(); @@ -86,9 +87,8 @@ public class DataScopeAspect { sqlString.append(StrUtil.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { sqlString.append(StrUtil.format( - // todo " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or {} )", - deptAlias, user.getDeptId(), user.getDeptId())); + deptAlias, user.getDeptId(), DatabaseUtil.handleFindInSet(user.getDeptId(), "ancestors"))); } else if (DATA_SCOPE_SELF.equals(dataScope)) { if (StrUtil.isNotBlank(userAlias)) { sqlString.append(StrUtil.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); @@ -104,7 +104,6 @@ public class DataScopeAspect { if (CollUtil.isEmpty(conditions)) { sqlString.append(StrUtil.format(" OR {}.dept_id = 0 ", deptAlias)); } -//find_in_set( {} , ancestors ) } } diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/LoginUser.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/LoginUser.java index cf28441..cbf750d 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/LoginUser.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/LoginUser.java @@ -60,13 +60,14 @@ public class LoginUser implements UserDetails { public LoginUser() { } - public LoginUser(String userId, String deptId, String username, String nickname, List roleKeys, Set permissions) { + public LoginUser(String userId, String deptId, String username, String nickname, List roles, List roleKeys, Set permissions) { this.userId = userId; this.deptId = deptId; this.username = username; this.permissions = permissions; this.nickname = nickname; this.roleKeys = roleKeys; + this.roles = roles; } public List getRoles() { diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/SecurityUser.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/SecurityUser.java index afe6423..da9c8f6 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/SecurityUser.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/SecurityUser.java @@ -1,5 +1,6 @@ package com.qiaoba.auth.entity; +import com.qiaoba.auth.entity.dto.RoleDto; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -40,16 +41,20 @@ public class SecurityUser implements Serializable { */ private String nickname; - /** * 角色列表 */ - private List roleKeys; + private List roles; + /** + * 角色Key列表 + */ + private List roleKeys; /** * 权限列表 */ private Set permissions; + } diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/dto/RoleDto.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/dto/RoleDto.java index f43ecaf..ce1bb82 100644 --- a/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/dto/RoleDto.java +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/entity/dto/RoleDto.java @@ -14,5 +14,6 @@ public class RoleDto { private String roleId; private String roleKey; + private String roleName; private String dataScope; } diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java index c74bc07..98af492 100644 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/context/BaseContext.java @@ -1,8 +1,5 @@ package com.qiaoba.common.base.context; -import java.util.HashMap; -import java.util.Map; - /** * 全局上下文对象 * @@ -12,31 +9,74 @@ import java.util.Map; */ public class BaseContext { - private static final String DATABASE_TYPE_MAP_KEY = "databaseType"; + /** + * 数据库类型 + */ + private static final ThreadLocal DATABASE_TYPE_HOLDER = new ThreadLocal<>(); - private static final ThreadLocal> CONTEXT_HOLDER = new ThreadLocal<>(); + /** + * 租户ID + */ + private static final ThreadLocal TENANT_ID_HOLDER = new ThreadLocal<>(); + + /** + * 数据源 + */ + private static final ThreadLocal DATASOURCE_HOLDER = new ThreadLocal<>(); + + /** + * 获取上下文中数据库类型 + */ + public static String getDatabaseType() { + return DATABASE_TYPE_HOLDER.get(); + } + + /** + * 设置上下文中数据库类型 + */ + public static void setDatabaseType(String type) { + DATABASE_TYPE_HOLDER.set(type); + } + + /** + * 获取上下文中租户ID + */ + public static String getTenantId() { + return TENANT_ID_HOLDER.get(); + } + + /** + * 设置上下文中租户ID + */ + public static void setTenantId(String tenantId) { + TENANT_ID_HOLDER.set(tenantId); + } /** * 获取上下文中的数据源 */ - public String getDatabaseType() { - return CONTEXT_HOLDER.get().get(DATABASE_TYPE_MAP_KEY).toString(); + public static String getDataSource() { + return DATASOURCE_HOLDER.get(); } /** * 设置上下文中的数据源 */ - public void setDatabaseType(String type) { - Map map = new HashMap<>(1); - map.put(DATABASE_TYPE_MAP_KEY, type); - CONTEXT_HOLDER.set(map); + public static void setDataSource(String dataSource) { + DATASOURCE_HOLDER.set(dataSource); } /** - * 清除上下文中的数据源 + * 清除所有的ThreadLocal */ - public void clearDataSource() { - CONTEXT_HOLDER.remove(); + public static void clearAllHolder() { + // 清除上下文中数据源 + DATASOURCE_HOLDER.remove(); + // 清除上下文中租户ID + TENANT_ID_HOLDER.remove(); + // 清除上下文中数据库类型 + DATABASE_TYPE_HOLDER.remove(); + } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/enums/DataBaseTypeEnum.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/enums/DataBaseTypeEnum.java similarity index 95% rename from qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/enums/DataBaseTypeEnum.java rename to qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/enums/DataBaseTypeEnum.java index 1ec8ac3..ab1233d 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/enums/DataBaseTypeEnum.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/enums/DataBaseTypeEnum.java @@ -1,4 +1,4 @@ -package com.qiaoba.common.database.enums; +package com.qiaoba.common.base.enums; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; @@ -48,4 +48,5 @@ public enum DataBaseTypeEnum { } return null; } + } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/DatabaseUtil.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/DatabaseUtil.java similarity index 52% rename from qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/DatabaseUtil.java rename to qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/DatabaseUtil.java index 503a512..d6306a5 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/DatabaseUtil.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/DatabaseUtil.java @@ -1,16 +1,10 @@ -package com.qiaoba.common.database.utils; +package com.qiaoba.common.base.utils; import cn.hutool.core.convert.Convert; -import com.qiaoba.common.base.exceptions.ServiceException; -import com.qiaoba.common.database.config.DynamicDataSourceConfig; -import com.qiaoba.common.database.enums.DataBaseTypeEnum; +import com.qiaoba.common.base.context.BaseContext; +import com.qiaoba.common.base.enums.DataBaseTypeEnum; import lombok.extern.slf4j.Slf4j; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.SQLException; - /** * 数据库工具类 * @@ -21,23 +15,15 @@ import java.sql.SQLException; @Slf4j public class DatabaseUtil { - /** - * 获取当前数据库类型 + * 根据数据库类型,处理find_in_set函数 + * + * @param var1 参数1 + * @param var2 参数2 + * @return 处理后的sql */ - public static DataBaseTypeEnum getDataBaseType() { - DataSource dataSource = (DataSource) DynamicDataSourceConfig.DATA_SOURCE_MAP.get(""); - try (Connection conn = dataSource.getConnection()) { - DatabaseMetaData metaData = conn.getMetaData(); - String databaseProductName = metaData.getDatabaseProductName(); - return DataBaseTypeEnum.find(databaseProductName); - } catch (SQLException e) { - throw new ServiceException(e.getMessage()); - } - } - public static String handleFindInSet(Object var1, String var2) { - DataBaseTypeEnum dataBaseType = getDataBaseType(); + DataBaseTypeEnum dataBaseType = DataBaseTypeEnum.find(BaseContext.getDatabaseType()); String var = Convert.toStr(var1); if (dataBaseType == DataBaseTypeEnum.SQL_SERVER) { // charindex(',100,' , ',0,100,101,') <> 0 diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/TenantUtil.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/TenantUtil.java deleted file mode 100644 index 4f171df..0000000 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/TenantUtil.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.qiaoba.common.base.utils; - -/** - * 租户工具类 - * - * @author ailanyin - * @version 1.0 - * @since 2023/5/9 12:57 - */ -public class TenantUtil { - - private static final ThreadLocal TENANT_ID_HOLDER = new ThreadLocal<>(); - - /** - * 获取登录用户的租户ID - * - * @return username - */ - public static String getTenantId() { - return TENANT_ID_HOLDER.get(); - } - - public static void clearTenantId() { - TENANT_ID_HOLDER.remove(); - } - - public static void setTenantId(String tenantId) { - TENANT_ID_HOLDER.set(tenantId); - } -} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceContext.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceContext.java index 004e6b7..dafa427 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceContext.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceContext.java @@ -1,5 +1,6 @@ package com.qiaoba.common.database.config; +import com.qiaoba.common.base.context.BaseContext; import com.qiaoba.common.database.constants.DynamicDatasourceConstant; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; @@ -15,9 +16,6 @@ import java.util.Map; public class DynamicDataSourceContext extends AbstractRoutingDataSource { - private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); - - /** * 设置默认数据源、全部数据源,及刷新 */ @@ -33,7 +31,7 @@ public class DynamicDataSourceContext extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { //获取当前指定的数据源 - return getDataSource(); + return BaseContext.getDataSource(); } @@ -41,24 +39,4 @@ public class DynamicDataSourceContext extends AbstractRoutingDataSource { public void afterPropertiesSet() { } - /** - * 获取上下文中的数据源 - */ - public String getDataSource() { - return CONTEXT_HOLDER.get(); - } - - /** - * 设置上下文中的数据源 - */ - public void setDataSource(String dataSource) { - CONTEXT_HOLDER.set(dataSource); - } - - /** - * 清除上下文中的数据源 - */ - public void clearDataSource() { - CONTEXT_HOLDER.remove(); - } } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java index 35747df..871ad72 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; -import com.qiaoba.common.base.utils.TenantUtil; +import com.qiaoba.common.base.context.BaseContext; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.StringValue; import org.springframework.context.annotation.Bean; @@ -26,7 +26,7 @@ public class MybatisPlusConfig { interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { @Override public Expression getTenantId() { - return new StringValue(TenantUtil.getTenantId()); + return new StringValue(BaseContext.getTenantId()); } @Override diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java index b448615..5f65cf9 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java @@ -1,9 +1,8 @@ package com.qiaoba.common.database.filters; -import com.qiaoba.common.base.utils.TenantUtil; +import com.qiaoba.common.base.context.BaseContext; import com.qiaoba.common.database.config.DynamicDataSourceContext; import com.qiaoba.common.database.constants.DynamicDatasourceConstant; -import com.qiaoba.common.database.utils.DatabaseUtil; import com.qiaoba.common.web.utils.ResponseUtil; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -33,14 +32,9 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - //设置当前租户对应的数据库 - dynamicDataSourceContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY); - // todo - TenantUtil.setTenantId("1"); - DatabaseUtil.handleFindInSet(); + before(); filterChain.doFilter(request, response); - dynamicDataSourceContext.clearDataSource(); - TenantUtil.clearTenantId(); + after(); } private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException { @@ -49,4 +43,17 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter { return false; } + private void before() { + // todo + //设置当前租户对应的数据源 + BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY); + //设置当前租户对应的租户ID + BaseContext.setTenantId("1"); + //设置当前租户对应的数据库类型 + BaseContext.setDatabaseType("MySQL"); + } + + private void after() { + BaseContext.clearAllHolder(); + } } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java new file mode 100644 index 0000000..350acc1 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java @@ -0,0 +1,25 @@ +package com.qiaoba.common.database.interceptors; + +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.statement.StatementHandler; + +import java.sql.Connection; +import java.sql.SQLException; + +@Slf4j +public class SchemaInterceptor implements InnerInterceptor { + + @Override + public void beforePrepare(StatementHandler sh, Connection conn, Integer transactionTimeout) { + String sql = "use `qiaoba-boot`;"; + try { + conn.createStatement().execute(sql); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + InnerInterceptor.super.beforePrepare(sh, conn, transactionTimeout); + } + +} diff --git a/qiaoba-commons/qiaoba-common-redis/src/main/java/com/qiaoba/common/redis/service/impl/RedisServiceImpl.java b/qiaoba-commons/qiaoba-common-redis/src/main/java/com/qiaoba/common/redis/service/impl/RedisServiceImpl.java index e6311f0..39cbc74 100644 --- a/qiaoba-commons/qiaoba-common-redis/src/main/java/com/qiaoba/common/redis/service/impl/RedisServiceImpl.java +++ b/qiaoba-commons/qiaoba-common-redis/src/main/java/com/qiaoba/common/redis/service/impl/RedisServiceImpl.java @@ -1,7 +1,7 @@ package com.qiaoba.common.redis.service.impl; -import com.qiaoba.common.base.utils.TenantUtil; +import com.qiaoba.common.base.context.BaseContext; import com.qiaoba.common.redis.service.RedisService; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; @@ -231,7 +231,7 @@ public class RedisServiceImpl implements RedisService { private String handleKey(String key) { StringBuilder sb = new StringBuilder(); - sb.append("tenant_").append(TenantUtil.getTenantId()).append(":").append(key); + sb.append("tenant_").append(BaseContext.getTenantId()).append(":").append(key); return sb.toString(); } } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java index e8b0918..2eb42ee 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java @@ -2,6 +2,7 @@ package com.qiaoba.module.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.qiaoba.api.system.entity.SysUserRole; +import com.qiaoba.auth.entity.dto.RoleDto; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -24,24 +25,6 @@ public interface SysUserRoleMapper extends BaseMapper { */ List selectRoleIdsByUserId(@Param("userId") String userId, @Param("status") String status); - /** - * 通过userId查询所绑定的角色Key列表 - * - * @param userId userId - * @param status 状态 - * @return roleIds - */ - List selectRoleKeysByUserId(@Param("userId") String userId, @Param("status") String status); - - /** - * 通过userId查询所绑定的角色Key列表 - * - * @param userId userId - * @param status 状态 - * @return roleIds - */ - List selectRoleNamesByUserId(@Param("userId") String userId, @Param("status") String status); - /** * 批量取消角色所绑定的用户 * @@ -56,4 +39,13 @@ public interface SysUserRoleMapper extends BaseMapper { * @param userIds userIds */ void deleteByUserIds(@Param("list") List userIds); + + /** + * 通过userId查询所绑定的角色(id + name)列表 + * + * @param userId userId + * @param status 状态 + * @return roles + */ + List selectRoleDtoByUserId(@Param("userId") String userId, @Param("status") String status); } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java index f1d9c47..7f777d0 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java @@ -1,6 +1,7 @@ package com.qiaoba.module.system.service; import com.qiaoba.api.system.entity.SysUserRole; +import com.qiaoba.auth.entity.dto.RoleDto; import java.util.List; @@ -52,22 +53,14 @@ public interface SysUserRoleService { List selectRoleIdsByUserId(String userId, String status); /** - * 通过userId查询所绑定的角色Key列表 + * 通过userId查询所绑定的角色(id + name)列表 * * @param userId userId * @param status 状态 - * @return roleIds + * @return roles */ - List selectRoleKeysByUserId(String userId, String status); + List selectRoleDtoByUserId(String userId, String status); - /** - * 通过userId查询所绑定的角色Key列表 - * - * @param userId userId - * @param status 状态 - * @return roleNames - */ - List selectRoleNamesByUserId(String userId, String status); /** * 批量选择用户授权 diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java index 4599d13..d7a0780 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java @@ -7,6 +7,7 @@ import com.qiaoba.api.system.service.SysUserDetailsApiService; import com.qiaoba.auth.constants.SecurityConstant; import com.qiaoba.auth.entity.LoginUser; import com.qiaoba.auth.entity.SecurityUser; +import com.qiaoba.auth.entity.dto.RoleDto; import com.qiaoba.common.base.enums.BaseEnum; import com.qiaoba.common.redis.service.RedisService; import com.qiaoba.module.system.service.SysMenuService; @@ -20,6 +21,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * 用户权限验证处理 @@ -41,7 +43,7 @@ public class SysUserDetailsServiceImpl implements UserDetailsService, SysUserDet public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if (redisService.hasKey(SecurityConstant.USER_DETAILS_REDIS_KEY + username)) { SecurityUser user = redisService.getObject(SecurityConstant.USER_DETAILS_REDIS_KEY + username, SecurityUser.class); - return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoleKeys(), user.getPermissions()); + return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoles(), user.getRoleKeys(), user.getPermissions()); } return toCache(username); @@ -50,8 +52,9 @@ public class SysUserDetailsServiceImpl implements UserDetailsService, SysUserDet private UserDetails createUserDetails(SysUser user) { Set perms = sysMenuService.selectPermsByUserId(user.getUserId()); - List roleKeys = sysUserRoleService.selectRoleKeysByUserId(user.getUserId(), BaseEnum.NORMAL.getCode()); - return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roleKeys, perms); + List roles = sysUserRoleService.selectRoleDtoByUserId(user.getUserId(), BaseEnum.NORMAL.getCode()); + List roleKeys = roles.stream().map(RoleDto::getRoleKey).collect(Collectors.toList()); + return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roles, roleKeys, perms); } @Override diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java index 94da2f0..84009bc 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.toolkit.Db; import com.qiaoba.api.system.entity.SysUserRole; +import com.qiaoba.auth.entity.dto.RoleDto; import com.qiaoba.common.base.constants.BaseConstant; import com.qiaoba.common.base.enums.BaseEnum; import com.qiaoba.module.system.mapper.SysUserRoleMapper; @@ -13,7 +14,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 用户角色关联 服务层实现 @@ -54,13 +57,8 @@ public class SysUserRoleServiceImpl implements SysUserRoleService { } @Override - public List selectRoleKeysByUserId(String userId, String status) { - return sysUserRoleMapper.selectRoleKeysByUserId(userId, status); - } - - @Override - public List selectRoleNamesByUserId(String userId, String status) { - return sysUserRoleMapper.selectRoleNamesByUserId(userId, status); + public List selectRoleDtoByUserId(String userId, String status) { + return sysUserRoleMapper.selectRoleDtoByUserId(userId, status); } @Override @@ -74,8 +72,9 @@ public class SysUserRoleServiceImpl implements SysUserRoleService { @Override public String selectRoleGroup(String userId) { - List list = selectRoleNamesByUserId(userId, BaseEnum.NORMAL.getCode()); - return CollUtil.isNotEmpty(list) ? StrUtil.join(BaseConstant.LINE_JOIN_STR, list) : StrUtil.EMPTY; + List list = selectRoleDtoByUserId(userId, BaseEnum.NORMAL.getCode()); + List names = list.stream().map(RoleDto::getRoleName).collect(Collectors.toList()); + return CollUtil.isNotEmpty(list) ? StrUtil.join(BaseConstant.LINE_JOIN_STR, names) : StrUtil.EMPTY; } private QueryWrapper createWrapper(String userId) { diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml index c161671..972d64d 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml @@ -13,17 +13,8 @@ - - - + select t2.role_id,t2.role_key,t2.role_name,t2.data_scope from sys_user_role t1 left join sys_role t2 on t2.role_id = t1.role_id where t1.user_id = #{userId}