¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.config.mybatis; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; |
| | | import org.jeecg.common.config.TenantContext; |
| | | import org.jeecg.common.constant.CommonConstant; |
| | | import org.jeecg.common.constant.TenantConstant; |
| | | import org.jeecg.common.util.SpringContextUtils; |
| | | import org.jeecg.common.util.TokenUtils; |
| | | import org.jeecg.common.util.oConvertUtils; |
| | | import org.mybatis.spring.annotation.MapperScan; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | |
| | | 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 net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.expression.LongValue; |
| | | |
| | | /** |
| | | * åæ°æ®æºé
ç½®ï¼jeecg.datasource.open = falseæ¶çæï¼ |
| | | * @Author zhoujf |
| | | * |
| | | */ |
| | | @Configuration |
| | | @MapperScan(value={"org.jeecg.modules.**.mapper*"}) |
| | | public class MybatisPlusSaasConfig { |
| | | |
| | | /** |
| | | * æ¯å¦å¼å¯ç³»ç»æ¨¡åçç§æ·é离 |
| | | * æ§å¶èå´ï¼ç¨æ·ãè§è²ãé¨é¨ãæçé¨é¨ãåå
¸ãåç±»åå
¸ã夿°æ®æºãèå¡ãéç¥å
Œ |
| | | * |
| | | * å®ç°åè½ |
| | | * 1.ç¨æ·è¡¨éè¿ç¡¬ç¼ç å®ç°ç§æ·IDé离 |
| | | * 2.è§è²ãé¨é¨ãæçé¨é¨ãåå
¸ãåç±»åå
¸ã夿°æ®æºãèå¡ãéç¥å
¬åé¤äºç¡¬ç¼ç è¿å å
¥ç TENANT_TABLE é
ç½®ä¸ï¼å®ç°ç§æ·é离æ´å®å
¨ |
| | | * 3.èå表ãç§æ·è¡¨ä¸åç§æ·é离 |
| | | * 4.éè¿æ¦æªå¨MybatisInterceptorå®ç°ï¼å¢å æ¹æ¥æ°æ® èªå¨æ³¨å
¥ç§æ·ID |
| | | */ |
| | | public static final Boolean OPEN_SYSTEM_TENANT_CONTROL = true; |
| | | |
| | | /** |
| | | * åªäºè¡¨éè¦åå¤ç§æ· 表éè¦æ·»å ä¸ä¸ªå段 tenant_id |
| | | */ |
| | | public static final List<String> TENANT_TABLE = new ArrayList<String>(); |
| | | |
| | | static { |
| | | //1.éè¦ç§æ·é离çè¡¨è¯·å¨æ¤é
ç½® |
| | | if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { |
| | | //a.ç³»ç»ç®¡ç表 |
| | | TENANT_TABLE.add("sys_role"); |
| | | TENANT_TABLE.add("sys_user_role"); |
| | | TENANT_TABLE.add("sys_depart"); |
| | | TENANT_TABLE.add("sys_category"); |
| | | TENANT_TABLE.add("sys_data_source"); |
| | | TENANT_TABLE.add("sys_position"); |
| | | TENANT_TABLE.add("sys_announcement"); |
| | | } |
| | | |
| | | //2.ç¤ºä¾æµè¯ |
| | | //TENANT_TABLE.add("demo"); |
| | | //3.onlineç§æ·é离æµè¯ |
| | | //TENANT_TABLE.add("ceapp_issue"); |
| | | |
| | | TENANT_TABLE.add("dry_eqp_type"); |
| | | TENANT_TABLE.add("dry_equipment"); |
| | | TENANT_TABLE.add("dry_eqp_type"); |
| | | TENANT_TABLE.add("dry_herb"); |
| | | TENANT_TABLE.add("dry_herb_type"); |
| | | TENANT_TABLE.add("dry_order"); |
| | | TENANT_TABLE.add("dry_shop"); |
| | | } |
| | | |
| | | |
| | | @Bean |
| | | public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| | | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
| | | // å
add TenantLineInnerInterceptor å add PaginationInnerInterceptor |
| | | interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { |
| | | @Override |
| | | public Expression getTenantId() { |
| | | String tenantId = TenantContext.getTenant(); |
| | | //妿éè¿çº¿ç¨è·åç§æ·ID为空ï¼åéè¿å½å请æ±çrequestè·åç§æ·ï¼shiroæé¤æ¦æªå¨ç请æ±ä¼è·åä¸å°ç§æ·IDï¼ |
| | | if(oConvertUtils.isEmpty(tenantId)){ |
| | | try { |
| | | tenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest()); |
| | | } catch (Exception e) { |
| | | //e.printStackTrace(); |
| | | } |
| | | } |
| | | if(oConvertUtils.isEmpty(tenantId)){ |
| | | tenantId = "0"; |
| | | } |
| | | return new LongValue(tenantId); |
| | | } |
| | | |
| | | @Override |
| | | public String getTenantIdColumn(){ |
| | | return TenantConstant.TENANT_ID_TABLE; |
| | | } |
| | | |
| | | // è¿å true 表示ä¸èµ°ç§æ·é»è¾ |
| | | @Override |
| | | public boolean ignoreTable(String tableName) { |
| | | for(String temp: TENANT_TABLE){ |
| | | if(temp.equalsIgnoreCase(tableName)){ |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | })); |
| | | //update-begin-author:zyf date:20220425 for:ãVUEN-606ãæ³¨å
¥å¨æè¡¨åéé
æ¦æªå¨è§£å³å¤è¡¨åé®é¢ |
| | | interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor()); |
| | | //update-end-author:zyf date:20220425 for:ãVUEN-606ãæ³¨å
¥å¨æè¡¨åéé
æ¦æªå¨è§£å³å¤è¡¨åé®é¢ |
| | | interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); |
| | | //ãjeecg-boot/issues/3847ãå¢å @Versionä¹è§éæ¯æ |
| | | interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); |
| | | return interceptor; |
| | | } |
| | | |
| | | /** |
| | | * å¨æè¡¨ååæ¢æ¦æªå¨,ç¨äºéé
vue2åvue3åä¸ä¸ªè¡¨æå¤ä¸ªçæ
åµ,å¦sys_role_indexå¨vue3æ
åµä¸è¡¨å为sys_role_index_v3 |
| | | * @return |
| | | */ |
| | | private DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() { |
| | | DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); |
| | | dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { |
| | | //è·åéè¦å¨æè§£æç表å |
| | | String dynamicTableName = ThreadLocalDataHelper.get(CommonConstant.DYNAMIC_TABLE_NAME); |
| | | //å½dynamicTableNameä¸ä¸ºç©ºæ¶æèµ°å¨æè¡¨åå¤çé»è¾,å¦åè¿ååå§è¡¨å |
| | | if (ObjectUtil.isNotEmpty(dynamicTableName) && dynamicTableName.equals(tableName)) { |
| | | // è·ååç«¯ä¼ éççæ¬å·æ è¯ |
| | | Object version = ThreadLocalDataHelper.get(CommonConstant.VERSION); |
| | | if (ObjectUtil.isNotEmpty(version)) { |
| | | //æ¼æ¥è¡¨åè§å(åå§è¡¨å+ä¸å线+åç«¯ä¼ éççæ¬å·) |
| | | return tableName + "_" + version; |
| | | } |
| | | } |
| | | return tableName; |
| | | }); |
| | | return dynamicTableNameInnerInterceptor; |
| | | } |
| | | |
| | | // /** |
| | | // * ä¸ä¸ªçæ¬ä¼å é¤ï¼ç°å¨ä¸ºäºé¿å
ç¼ååºç°é®é¢ä¸å¾ä¸é
ç½® |
| | | // * @return |
| | | // */ |
| | | // @Bean |
| | | // public ConfigurationCustomizer configurationCustomizer() { |
| | | // return configuration -> configuration.setUseDeprecatedExecutor(false); |
| | | // } |
| | | // /** |
| | | // * mybatis-plus SQLæ§è¡æçæä»¶ãç产ç¯å¢å¯ä»¥å
³éã |
| | | // */ |
| | | // @Bean |
| | | // public PerformanceInterceptor performanceInterceptor() { |
| | | // return new PerformanceInterceptor(); |
| | | // } |
| | | |
| | | } |