package com.jsh.erp.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.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler; import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser; import com.jsh.erp.datasource.entities.User; 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.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @Configuration public class TenantConfig { @Bean public PaginationInterceptor paginationInterceptor(HttpServletRequest request) { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); List<ISqlParser> sqlParserList = new ArrayList<>(); TenantSqlParser tenantSqlParser = new TenantSqlParser(); tenantSqlParser.setTenantHandler(new TenantHandler() { @Override public Expression getTenantId() { //从session中获取租户id Object tenantId = request.getSession().getAttribute("tenantId"); if(tenantId!=null){ return new LongValue(Long.parseLong(tenantId.toString())); } else { return null; } } @Override public String getTenantIdColumn() { return "tenant_id"; } @Override public boolean doTableFilter(String tableName) { //获取开启状态 Object tenantId = request.getSession().getAttribute("tenantId"); if(tenantId!=null) { //从session中获取租户id String loginName = null; Object userInfo = request.getSession().getAttribute("user"); if(userInfo != null) { User user = (User) userInfo; loginName = user.getLoginName(); } if(("admin").equals(loginName)) { return true; } else { // 这里可以判断是否过滤表 if ("jsh_materialproperty".equals(tableName) || "jsh_sequence".equals(tableName) || "jsh_userbusiness".equals(tableName) || "jsh_functions".equals(tableName) || "jsh_tenant".equals(tableName)) { return true; } else { return false; } } } else { return true; } } }); sqlParserList.add(tenantSqlParser); paginationInterceptor.setSqlParserList(sqlParserList); paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() { @Override public boolean doFilter(MetaObject metaObject) { MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject); // 过滤自定义查询此时无租户信息约束出现 if ("com.jsh.erp.datasource.mappers.UserMapperEx.getUserListByUserNameOrLoginName".equals(ms.getId())|| "com.jsh.erp.datasource.mappers.DepotItemMapperEx.getStockByParam".equals(ms.getId())) { return true; } return false; } }); return paginationInterceptor; } /** * 相当于顶部的: * {@code @MapperScan("com.jsh.erp.datasource.mappers*")} * 这里可以扩展,比如使用配置文件来配置扫描Mapper的路径 */ @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer(); scannerConfigurer.setBasePackage("com.jsh.erp.datasource.mappers*"); return scannerConfigurer; } /** * 性能分析拦截器,不建议生产使用 */ @Bean public PerformanceInterceptor performanceInterceptor(){ return new PerformanceInterceptor(); } }