Skip to content

Commit 175b729

Browse files
authored
Merge pull request #83 from hocgin/v1.0.24
feat: sso client logout
2 parents 3ca3cd5 + c2f1a3a commit 175b729

File tree

59 files changed

+1279
-45
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1279
-45
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<version>${revision}</version>
1717

1818
<properties>
19-
<revision>1.0.23</revision>
19+
<revision>1.0.24</revision>
2020

2121
<java.version>1.8</java.version>
2222
<java.source.version>1.8</java.source.version>

spring-boot-dependencies/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
<modelVersion>4.0.0</modelVersion>
1212
<packaging>pom</packaging>
1313

14-
<name>Spring Boot :: Starters :: Parent</name>
14+
<name>Spring Boot :: Dependencies</name>
1515
<artifactId>spring-boot-dependencies</artifactId>
1616

1717
<properties>
1818
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
1919
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
20-
<mybatis-plus.version>3.3.0</mybatis-plus.version>
20+
<mybatis-plus.version>3.5.0</mybatis-plus.version>
2121
<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
2222
<guava.version>28.1-jre</guava.version>
2323
<hutool-all.version>5.3.10</hutool-all.version>

spring-boot-excel/excel-spring-boot-autoconfigure/src/main/java/in/hocg/boot/excel/autoconfiguration/utils/ExcelUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package in.hocg.boot.excel.autoconfiguration.utils;
22

33
import com.baomidou.mybatisplus.core.metadata.IPage;
4-
import in.hocg.boot.mybatis.plus.autoconfiguration.ro.PageRo;
4+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.pojo.ro.PageRo;
55
import lombok.experimental.UtilityClass;
66

77
import java.util.List;

spring-boot-mybatis-plus/mybatis-plus-spring-boot-autoconfigure/src/main/java/in/hocg/boot/mybatis/plus/autoconfiguration/MyBatisPlusAutoConfiguration.java

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
11
package in.hocg.boot.mybatis.plus.autoconfiguration;
22

3+
import com.baomidou.mybatisplus.annotation.IdType;
34
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
45
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
56
import com.baomidou.mybatisplus.core.config.GlobalConfig;
6-
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
7+
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
8+
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
9+
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
10+
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
11+
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
712
import com.google.common.collect.Sets;
13+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.ColumnConstants;
14+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.context.DefaultMybatisContextHolder;
15+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.context.MybatisContextHolder;
16+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.fill.BootMetaObjectHandler;
17+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.tenant.BootTenantHandler;
18+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.interceptor.LogicDeleteInterceptor;
819
import in.hocg.boot.mybatis.plus.autoconfiguration.properties.MyBatisPlusProperties;
920
import in.hocg.boot.utils.LangUtils;
1021
import lombok.RequiredArgsConstructor;
22+
import lombok.Setter;
1123
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1225
import org.springframework.boot.context.properties.EnableConfigurationProperties;
26+
import org.springframework.context.ApplicationContext;
27+
import org.springframework.context.ApplicationContextAware;
1328
import org.springframework.context.annotation.Bean;
1429
import org.springframework.context.annotation.Configuration;
1530
import org.springframework.context.annotation.Lazy;
@@ -27,18 +42,57 @@
2742
@AutoConfigureAfter(MybatisPlusAutoConfiguration.class)
2843
@EnableConfigurationProperties(MyBatisPlusProperties.class)
2944
@RequiredArgsConstructor(onConstructor = @__(@Lazy))
30-
public class MyBatisPlusAutoConfiguration {
45+
public class MyBatisPlusAutoConfiguration implements ApplicationContextAware {
46+
private final MyBatisPlusProperties properties;
47+
@Setter
48+
private ApplicationContext applicationContext;
3149

3250
@Bean
33-
public PaginationInterceptor paginationInterceptor() {
34-
return new PaginationInterceptor();
51+
@ConditionalOnMissingBean
52+
public MybatisPlusInterceptor mybatisPlusInterceptor(MybatisContextHolder contextHolder) {
53+
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
54+
if (properties.getTenant().getEnable()) {
55+
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(tenantLineHandler(properties, contextHolder)));
56+
}
57+
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
58+
interceptor.addInnerInterceptor(new LogicDeleteInterceptor(contextHolder));
59+
return interceptor;
60+
}
61+
62+
@Bean
63+
@ConditionalOnMissingBean
64+
public TenantLineHandler tenantLineHandler(MyBatisPlusProperties properties, MybatisContextHolder contextHolder) {
65+
return new BootTenantHandler(properties, contextHolder);
66+
}
67+
68+
69+
@Bean
70+
@ConditionalOnMissingBean
71+
public MetaObjectHandler metaObjectHandler(MybatisContextHolder contextHolder) {
72+
return new BootMetaObjectHandler(applicationContext, contextHolder);
73+
}
74+
75+
@Bean
76+
@ConditionalOnMissingBean
77+
public MybatisContextHolder mybatisPlusContextHolder() {
78+
return new DefaultMybatisContextHolder();
3579
}
3680

3781
@Bean
3882
@Primary
39-
public MybatisPlusProperties myBatisPlusProperties(MybatisPlusProperties properties) {
83+
public MybatisPlusProperties myBatisPlusProperties(MybatisPlusProperties properties,
84+
MetaObjectHandler metaObjectHandler) {
4085
GlobalConfig globalConfig = LangUtils.getOrDefault(properties.getGlobalConfig(), new GlobalConfig());
4186
globalConfig.setBanner(false);
87+
88+
GlobalConfig.DbConfig dbConfig = LangUtils.getOrDefault(globalConfig.getDbConfig(), new GlobalConfig.DbConfig());
89+
dbConfig.setIdType(IdType.ASSIGN_ID);
90+
dbConfig.setLogicDeleteField(ColumnConstants.DELETED_AT);
91+
dbConfig.setLogicDeleteValue("NOW(6)");
92+
dbConfig.setLogicNotDeleteValue("NULL");
93+
globalConfig.setDbConfig(dbConfig);
94+
95+
globalConfig.setMetaObjectHandler(metaObjectHandler);
4296
properties.setGlobalConfig(globalConfig);
4397

4498
Set<String> locations = Sets.newHashSet(properties.getMapperLocations());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core;
2+
3+
/**
4+
* Created by hocgin on 2021/12/31
5+
6+
*
7+
* @author hocgin
8+
*/
9+
public class ColumnConstants {
10+
public static final String TENANT_ID = "tenant_id";
11+
public static final String ID = "id";
12+
public static final String CREATED_AT = "created_at";
13+
public static final String CREATOR = "creator";
14+
public static final String LAST_UPDATED_AT = "last_updated_at";
15+
public static final String LAST_UPDATER = "last_updater";
16+
public static final String DELETED_AT = "deleted_at";
17+
public static final String DELETER = "deleter";
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core.context;
2+
3+
/**
4+
* Created by hocgin on 2022/1/2
5+
6+
*
7+
* @author hocgin
8+
*/
9+
public class DefaultMybatisContextHolder implements MybatisContextHolder {
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core.context;
2+
3+
/**
4+
* Created by hocgin on 2022/1/2
5+
6+
*
7+
* @author hocgin
8+
*/
9+
public interface MybatisContextHolder {
10+
11+
/**
12+
* 当前操作人
13+
*
14+
* @return id
15+
*/
16+
default Long getUserId() {
17+
return null;
18+
}
19+
20+
21+
/**
22+
* 当前租户
23+
*
24+
* @return id
25+
*/
26+
default Long getTenantId() {
27+
return null;
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core.context;
2+
3+
import lombok.experimental.UtilityClass;
4+
5+
/**
6+
* Created by hocgin on 2021/12/31
7+
8+
*
9+
* @author hocgin
10+
*/
11+
@UtilityClass
12+
@Deprecated
13+
public class TenantContextHolder {
14+
private final ThreadLocal<Long> TENANT = ThreadLocal.withInitial(() -> null);
15+
16+
public void setTenantId(Long tenantId) {
17+
TENANT.set(tenantId);
18+
}
19+
20+
public Long getTenantId() {
21+
return TENANT.get();
22+
}
23+
24+
public void clear() {
25+
TENANT.remove();
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core.context;
2+
3+
import lombok.experimental.UtilityClass;
4+
5+
/**
6+
* Created by hocgin on 2021/12/31
7+
8+
*
9+
* @author hocgin
10+
*/
11+
@UtilityClass
12+
@Deprecated
13+
public class UserContextHolder {
14+
private final ThreadLocal<Long> USER_ID = ThreadLocal.withInitial(() -> null);
15+
16+
public void setUserId(Long tenantId) {
17+
USER_ID.set(tenantId);
18+
}
19+
20+
public Long getUserId() {
21+
return USER_ID.get();
22+
}
23+
24+
public void clear() {
25+
USER_ID.remove();
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.fill;
2+
3+
import cn.hutool.core.collection.CollUtil;
4+
import cn.hutool.core.util.ClassUtil;
5+
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
6+
import com.baomidou.mybatisplus.core.metadata.TableInfo;
7+
import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
8+
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
9+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.context.MybatisContextHolder;
10+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.listeners.EntityListeners;
11+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.listeners.PreInsert;
12+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.enhance.listeners.PreUpdate;
13+
import in.hocg.boot.mybatis.plus.autoconfiguration.core.struct.basic.enhance.CommonEntity;
14+
import lombok.RequiredArgsConstructor;
15+
import lombok.extern.slf4j.Slf4j;
16+
import org.apache.ibatis.reflection.MetaObject;
17+
import org.apache.ibatis.reflection.property.PropertyNamer;
18+
import org.springframework.context.ApplicationContext;
19+
20+
import java.lang.reflect.InvocationTargetException;
21+
import java.lang.reflect.Method;
22+
import java.time.LocalDateTime;
23+
import java.util.List;
24+
25+
/**
26+
* Created by hocgin on 2021/12/31
27+
28+
* <br/>
29+
* 职责:
30+
* <br/>
31+
* 1. 填充基础字段
32+
* <br/>
33+
* - 填充创建人、创建时间
34+
* <br/>
35+
* - 填充修改人、修改时间
36+
* <br/>
37+
* 2. 触发实体监听器
38+
* <br/>
39+
*
40+
* @author hocgin
41+
*/
42+
@Slf4j
43+
@RequiredArgsConstructor
44+
public class BootMetaObjectHandler implements MetaObjectHandler {
45+
private final ApplicationContext applicationContext;
46+
private final MybatisContextHolder contextHolder;
47+
48+
@Override
49+
public void insertFill(MetaObject metaObject) {
50+
hookEntityListeners(metaObject, true);
51+
52+
this.strictInsertFill(metaObject, getFieldName(CommonEntity<CommonEntity<?>>::getCreatedAt), LocalDateTime::now, LocalDateTime.class);
53+
this.strictInsertFill(metaObject, getFieldName(CommonEntity<CommonEntity<?>>::getCreator), contextHolder::getUserId, Long.class);
54+
}
55+
56+
@Override
57+
public void updateFill(MetaObject metaObject) {
58+
hookEntityListeners(metaObject, false);
59+
60+
this.strictUpdateFill(metaObject, getFieldName(CommonEntity<CommonEntity<?>>::getLastUpdatedAt), LocalDateTime::now, LocalDateTime.class);
61+
this.strictUpdateFill(metaObject, getFieldName(CommonEntity<CommonEntity<?>>::getLastUpdater), contextHolder::getUserId, Long.class);
62+
}
63+
64+
private void hookEntityListeners(MetaObject metaObject, boolean isInsert) {
65+
TableInfo tableInfo = this.findTableInfo(metaObject);
66+
Class<?> entityType = tableInfo.getEntityType();
67+
68+
// 未使用注解的情况下,直接返回
69+
if (!entityType.isAnnotationPresent(EntityListeners.class)) {
70+
return;
71+
}
72+
73+
Class<?>[] classes = entityType.getAnnotation(EntityListeners.class).value();
74+
for (Class<?> aClass : classes) {
75+
List<Method> methods = ClassUtil.getPublicMethods(aClass, method -> isInsert ? method.isAnnotationPresent(PreInsert.class) : method.isAnnotationPresent(PreUpdate.class));
76+
if (CollUtil.isEmpty(methods)) {
77+
break;
78+
}
79+
Object bean = applicationContext.getBean(aClass);
80+
Object originalObject = metaObject.getOriginalObject();
81+
for (Method method : methods) {
82+
try {
83+
method.invoke(bean, originalObject);
84+
} catch (IllegalAccessException | InvocationTargetException e) {
85+
log.warn("{} 的 @{} 扩展事件[@{}]调用失败", aClass.getName(), EntityListeners.class.getSimpleName(), isInsert ? PreInsert.class.getSimpleName() : PreUpdate.class.getSimpleName());
86+
}
87+
}
88+
}
89+
}
90+
91+
private <T> String getFieldName(SFunction<T, ?> func) {
92+
return PropertyNamer.methodToProperty(LambdaUtils.extract(func).getImplMethodName());
93+
}
94+
}

0 commit comments

Comments
 (0)