|
|
@@ -0,0 +1,131 @@
|
|
|
+package com.zhongzheng.core.config;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.parser.ISqlParser;
|
|
|
+import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
|
|
|
+import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
|
|
|
+import net.sf.jsqlparser.expression.Expression;
|
|
|
+import net.sf.jsqlparser.expression.LongValue;
|
|
|
+import org.apache.ibatis.mapping.MappedStatement;
|
|
|
+import org.apache.ibatis.reflection.MetaObject;
|
|
|
+import org.mybatis.spring.annotation.MapperScan;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author yangdamao
|
|
|
+ * @date 2023年05月31日 15:03
|
|
|
+ */
|
|
|
+@Configuration
|
|
|
+@MapperScan(basePackages = {"com.zhongzheng.modules.goods.mapper"})
|
|
|
+public class MybatisFilterConfig {
|
|
|
+
|
|
|
+ @Autowired//自动注入request
|
|
|
+ private HttpServletRequest request;
|
|
|
+
|
|
|
+ private static final Map<String, String> IGNORE_TENANT_SMAP = new HashMap<String, String>() {{
|
|
|
+ // 这些mapper 方法也不修改
|
|
|
+// put("com.test.first.dao.TestMapper.getId","");
|
|
|
+// put("com.test.first.dao.TestMapper.getId2","");
|
|
|
+// put("com.test.first.dao.TestMapper.getId3","");
|
|
|
+ }};
|
|
|
+
|
|
|
+ private static final HashSet<String> TABLE_FILTER = new HashSet();
|
|
|
+
|
|
|
+ static {
|
|
|
+ // 过滤表, 这些表不进行修改
|
|
|
+ TABLE_FILTER.add("sys_tenant");
|
|
|
+ TABLE_FILTER.add("top_merchant");
|
|
|
+// TABLE_FILTER.add("sys_user2");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ @SuppressWarnings("all")
|
|
|
+ public PaginationInterceptor paginationInterceptor() {
|
|
|
+ PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
|
|
|
+
|
|
|
+ // sql 解析器
|
|
|
+ List<ISqlParser> sqlParserList = new ArrayList<>();
|
|
|
+ TenantSqlParser tenantSqlParser = new TenantSqlParser();
|
|
|
+ tenantSqlParser.setTenantHandler(new TenantHandler() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Expression getTenantId(boolean select) {
|
|
|
+ // 此处返回sys_code 字段值, 修改sql时候的参数, 从session 里面获取用户,
|
|
|
+ // 或者其他方式获取用户标识, 这里方便直接写死了
|
|
|
+ String storeId = request.getHeader("StoreId");
|
|
|
+ return new LongValue(StringUtils.isNotBlank(storeId)?storeId:"0");
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public String getTenantIdColumn() {
|
|
|
+ // 返回增加条件的字段
|
|
|
+ return "store_id";
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public boolean doTableFilter(String tableName) {
|
|
|
+ // 这里可以判断是否过滤表
|
|
|
+ // 对没有sys_code 的表格进行过滤
|
|
|
+ if (TABLE_FILTER.contains(tableName) || StringUtils.isBlank(request.getHeader("StoreId"))) {
|
|
|
+ // 返回true 则不过滤
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 添加到解析器, 如需添加多个, 这个地方是list, 多new几个, new TenantSqlParser(); 即可
|
|
|
+ sqlParserList.add(tenantSqlParser);
|
|
|
+
|
|
|
+ TenantSqlParser tenantSqlParser1 = new TenantSqlParser();
|
|
|
+ tenantSqlParser1.setTenantHandler(new TenantHandler() {
|
|
|
+ @Override
|
|
|
+ public Expression getTenantId(boolean select) {
|
|
|
+ // 此处返回sys_code 字段值, 修改sql时候的参数, 从session 里面获取用户,
|
|
|
+ // 或者其他方式获取用户标识, 这里方便直接写死了
|
|
|
+ String merId = request.getHeader("MerId");
|
|
|
+ return new LongValue(StringUtils.isNotBlank(merId)?merId:"0");
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public String getTenantIdColumn() {
|
|
|
+ // 返回增加条件的字段
|
|
|
+ return "mer_id";
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public boolean doTableFilter(String tableName) {
|
|
|
+ // 这里可以判断是否过滤表
|
|
|
+ // 对没有sys_code 的表格进行过滤
|
|
|
+ if (TABLE_FILTER.contains(tableName) || StringUtils.isBlank(request.getHeader("MerId"))) {
|
|
|
+ // 返回true 则不过滤
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ sqlParserList.add(tenantSqlParser1);
|
|
|
+
|
|
|
+ // 设置解析器集合
|
|
|
+ paginationInterceptor.setSqlParserList(sqlParserList);
|
|
|
+
|
|
|
+ // 过滤函数
|
|
|
+ paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
|
|
|
+ @Override
|
|
|
+ public boolean doFilter(MetaObject metaObject) {
|
|
|
+ MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
|
|
|
+ // com.test.first.dao.TestMapper.getId 精确到mapper 方法级
|
|
|
+ if (IGNORE_TENANT_SMAP.containsKey(ms.getId())) {
|
|
|
+ // 不进行修改
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return paginationInterceptor;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|