From a5c5d88b46e86e859ed9d1a92bd8b76846a71008 Mon Sep 17 00:00:00 2001 From: mi9688 Date: Thu, 17 Oct 2024 18:17:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9A=94=E7=A6=BB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fastbee/common/holder/ProjectHolder.java | 23 ++++++ .../fastbee/common/holder/ProjectInfo.java | 17 +++++ .../framework/config/ResourcesConfig.java | 7 ++ .../ProjectDataIsolationInterceptor.java | 71 +++++++++++++++++++ .../fastbee/ggroup/enums/GroupTagEnum.java | 1 + .../fastbee/ggroup/mapper/GGroupsMapper.java | 6 +- .../ggroup/service/IGGroupsService.java | 4 +- .../service/impl/GGroupsServiceImpl.java | 61 +++++++++++++--- .../com/fastbee/project/domain/Project.java | 7 +- .../fastbee/project/mapper/ProjectMapper.java | 3 +- .../service/impl/ProjectServiceImpl.java | 44 ++++++++++-- .../mapper/project/ProjectMapper.xml | 7 +- 12 files changed, 227 insertions(+), 24 deletions(-) create mode 100644 fastbee-common/src/main/java/com/fastbee/common/holder/ProjectHolder.java create mode 100644 fastbee-common/src/main/java/com/fastbee/common/holder/ProjectInfo.java create mode 100644 fastbee-framework/src/main/java/com/fastbee/framework/interceptor/ProjectDataIsolationInterceptor.java diff --git a/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectHolder.java b/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectHolder.java new file mode 100644 index 0000000..c99380a --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectHolder.java @@ -0,0 +1,23 @@ +package com.fastbee.common.holder; + + + +/** + * @author mijiupro + */ +public class ProjectHolder { + private static final ThreadLocal TOKEN_HOLDER = new ThreadLocal<>(); + + public static void setProjectInfo( ProjectInfo projectInfo) { + TOKEN_HOLDER.set( projectInfo); + } + + public static ProjectInfo getProjectInfo() { + return TOKEN_HOLDER.get(); + } + + public static void clear() { + TOKEN_HOLDER.remove(); + } + +} diff --git a/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectInfo.java b/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectInfo.java new file mode 100644 index 0000000..7f0b264 --- /dev/null +++ b/fastbee-common/src/main/java/com/fastbee/common/holder/ProjectInfo.java @@ -0,0 +1,17 @@ +package com.fastbee.common.holder; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Builder +@Data +public class ProjectInfo { + + private String projectName;//项目名称 + private String projectAdminId;//项目管理员id + private List projectIdList;//项目id列表包含子项目id + private String projectId;//当前项目id + +} diff --git a/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java b/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java index 8cccc05..2c7f6be 100644 --- a/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java +++ b/fastbee-framework/src/main/java/com/fastbee/framework/config/ResourcesConfig.java @@ -3,6 +3,7 @@ package com.fastbee.framework.config; import java.util.concurrent.TimeUnit; import com.fastbee.framework.interceptor.LanguageInterceptor; +import com.fastbee.framework.interceptor.ProjectDataIsolationInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,6 +33,9 @@ public class ResourcesConfig implements WebMvcConfigurer @Resource private LanguageInterceptor languageInterceptor; + @Autowired + private ProjectDataIsolationInterceptor projectDataIsolationInterceptor; + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { @@ -55,6 +59,9 @@ public class ResourcesConfig implements WebMvcConfigurer //这里配置国际化拦截器的白名单 registry.addInterceptor(languageInterceptor).addPathPatterns("/**").excludePathPatterns("/v2/api-docs", "/tool/gen/**"); + //配置项目数据隔离拦截器 + registry.addInterceptor(projectDataIsolationInterceptor) + .addPathPatterns("/gis/groups/**", "/gis/legend/**","/gis/site/**"); } /** diff --git a/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/ProjectDataIsolationInterceptor.java b/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/ProjectDataIsolationInterceptor.java new file mode 100644 index 0000000..a724a8f --- /dev/null +++ b/fastbee-framework/src/main/java/com/fastbee/framework/interceptor/ProjectDataIsolationInterceptor.java @@ -0,0 +1,71 @@ +package com.fastbee.framework.interceptor; + + +import cn.hutool.core.codec.Base64; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.fastbee.common.holder.ProjectHolder; +import com.fastbee.common.holder.ProjectInfo; +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.annotation.Nullable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + + +/** + * @author mijiupro + */ + +@Component +@Slf4j +public class ProjectDataIsolationInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception { + + log.info("进入项目数据隔离拦截器"); + //放行预检请求 + if ("OPTIONS".equalsIgnoreCase(Objects.requireNonNull(request.getMethod()))) { + return true; + } + if ("DELETE".equalsIgnoreCase(request.getMethod())) { + return true; + } + if ("POST".equalsIgnoreCase(request.getMethod())) { + return true; + } + if ("PUT".equalsIgnoreCase(request.getMethod())) { + return true; + } + //获取路径中的查询字符串参数 + String projectIds = request.getParameter("projectIds"); + if (StringUtils.isBlank(projectIds)) { + return true; + } + byte[] decode = Base64.decode(projectIds); + //转成List集合 + String decodedStr = new String(decode); + JSONArray objects = JSONUtil.parseArray(decodedStr); + ProjectHolder.setProjectInfo(ProjectInfo.builder() + .projectIdList(objects.toList(Long.class)) + .build()); + return true; + } + @Override + public void afterCompletion(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, @Nullable Exception ex) { + // 清理本地线程 + ProjectHolder.clear(); + } +} \ No newline at end of file diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/enums/GroupTagEnum.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/enums/GroupTagEnum.java index 955d1ce..5beabb9 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/enums/GroupTagEnum.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/enums/GroupTagEnum.java @@ -9,6 +9,7 @@ public enum GroupTagEnum { MONITORING_STATIONS(3, "检测站点"), OTHER_OBJECTS(4, "其他对象"), WATER_AFFAIRS(5, "水利事务"), + ADMINISTRATIVE_REGION(7, "行政区域"), ALARM_EVENTS(6, "报警事件"); private final int code; diff --git a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/mapper/GGroupsMapper.java b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/mapper/GGroupsMapper.java index 6c6fef1..acb7c61 100644 --- a/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/mapper/GGroupsMapper.java +++ b/fastbee-service/fastbee-ggroup-service/src/main/java/com/fastbee/ggroup/mapper/GGroupsMapper.java @@ -4,6 +4,7 @@ package com.fastbee.ggroup.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.fastbee.ggroup.domain.GGroups; import com.fastbee.ggroup.domain.vo.GGroupSiteVo; +import com.github.yulichang.base.MPJBaseMapper; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -15,7 +16,7 @@ import java.util.List; * @date 2024-09-27 */ -public interface GGroupsMapper extends BaseMapper +public interface GGroupsMapper extends MPJBaseMapper { /** * 查询组 @@ -36,7 +37,8 @@ public interface GGroupsMapper extends BaseMapper @Select({ "