This commit is contained in:
wwb 2026-09-16 10:28:54 +08:00
parent fbd51114ae
commit 57bceb7a34
16 changed files with 1505 additions and 1506 deletions

View File

@ -1,119 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>嘉晋OMS系统</description>
<modules>
<module>hangtag-dependencies</module>
<module>hangtag-framework</module>
<module>hangtag-server</module>
<module>hangtag-module-system</module>
<module>hangtag-module-infra</module>
<module>hangtag-module-oms</module>
</modules>
<properties>
<lombok.version>1.18.30</lombok.version>
<java.version>1.8</java.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<maven.compiler.target>${java.version}</maven.compiler.target>
<mapstruct.version>1.5.5.Final</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
<revision>2.1.0-jdk8-snapshot</revision>
<spring.boot.version>2.7.18</spring.boot.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-dependencies</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>huaweicloud</id>
<name>huawei</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</repository>
<repository>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring.boot.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>${flatten-maven-plugin.version}</version>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
<configuration>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
<updatePomFile>true</updatePomFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>嘉晋OMS系统</description>
<modules>
<module>hangtag-dependencies</module>
<module>hangtag-framework</module>
<module>hangtag-server</module>
<module>hangtag-module-system</module>
<module>hangtag-module-infra</module>
<module>hangtag-module-oms</module>
</modules>
<properties>
<lombok.version>1.18.30</lombok.version>
<java.version>1.8</java.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<maven.compiler.target>${java.version}</maven.compiler.target>
<mapstruct.version>1.5.5.Final</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
<revision>2.1.0-jdk8-snapshot</revision>
<spring.boot.version>2.7.18</spring.boot.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-dependencies</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>huaweicloud</id>
<name>huawei</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</repository>
<repository>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring.boot.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>${flatten-maven-plugin.version}</version>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
<configuration>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
<updatePomFile>true</updatePomFile>
</configuration>
</plugin>
</plugins>
</build>
</project>

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<description>该包是技术组件,每个子包,代表一个组件。每个组件包括两部分:
1. core 包:是该组件的核心封装
2. config 包:是该组件基于 Spring 的配置
技术组件,也分成两类:
1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展
2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。
如果是业务组件,Maven 名字会包含 biz</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<modules>
<module>hangtag-common</module>
<module>hangtag-spring-boot-starter-mybatis</module>
<module>hangtag-spring-boot-starter-redis</module>
<module>hangtag-spring-boot-starter-web</module>
<module>hangtag-spring-boot-starter-security</module>
<module>hangtag-spring-boot-starter-websocket</module>
<module>hangtag-spring-boot-starter-monitor</module>
<module>hangtag-spring-boot-starter-protection</module>
<module>hangtag-spring-boot-starter-job</module>
<module>hangtag-spring-boot-starter-mq</module>
<module>hangtag-spring-boot-starter-excel</module>
<module>hangtag-spring-boot-starter-test</module>
<module>hangtag-spring-boot-starter-biz-tenant</module>
<module>hangtag-spring-boot-starter-biz-data-permission</module>
<module>hangtag-spring-boot-starter-biz-ip</module>
</modules>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<description>该包是技术组件,每个子包,代表一个组件。每个组件包括两部分:
1. core 包:是该组件的核心封装
2. config 包:是该组件基于 Spring 的配置
技术组件,也分成两类:
1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展
2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。
如果是业务组件,Maven 名字会包含 biz</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<modules>
<module>hangtag-common</module>
<module>hangtag-spring-boot-starter-mybatis</module>
<module>hangtag-spring-boot-starter-redis</module>
<module>hangtag-spring-boot-starter-web</module>
<module>hangtag-spring-boot-starter-security</module>
<module>hangtag-spring-boot-starter-websocket</module>
<module>hangtag-spring-boot-starter-monitor</module>
<module>hangtag-spring-boot-starter-protection</module>
<module>hangtag-spring-boot-starter-job</module>
<module>hangtag-spring-boot-starter-mq</module>
<module>hangtag-spring-boot-starter-excel</module>
<module>hangtag-spring-boot-starter-test</module>
<module>hangtag-spring-boot-starter-biz-tenant</module>
<module>hangtag-spring-boot-starter-biz-data-permission</module>
<module>hangtag-spring-boot-starter-biz-ip</module>
</modules>
</project>

View File

@ -1,125 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>定义基础 pojo 类、枚举、工具类等等</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-anno</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>定义基础 pojo 类、枚举、工具类等等</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-anno</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,108 +1,108 @@
package cn.hangtag.framework.datapermission.core.aop;
import cn.hutool.core.collection.CollUtil;
import cn.hangtag.framework.datapermission.core.annotation.DataPermission;
import cn.hangtag.framework.test.core.ut.BaseMockitoUnitTest;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import java.lang.reflect.Method;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;
/**
* {@link DataPermissionAnnotationInterceptor} 的单元测试
*
* @author 芋道源码
*/
public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest {
@InjectMocks
private DataPermissionAnnotationInterceptor interceptor;
@Mock
private MethodInvocation methodInvocation;
@BeforeEach
public void setUp() {
interceptor.getDataPermissionCache().clear();
}
@Test // 无 @DataPermission 注解
public void testInvoke_none() throws Throwable {
// 参数
mockMethodInvocation(TestNone.class);
// 调用
Object result = interceptor.invoke(methodInvocation);
// 断言
assertEquals("none", result);
assertEquals(1, interceptor.getDataPermissionCache().size());
assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
}
@Test // 在 Method 上有 @DataPermission 注解
public void testInvoke_method() throws Throwable {
// 参数
mockMethodInvocation(TestMethod.class);
// 调用
Object result = interceptor.invoke(methodInvocation);
// 断言
assertEquals("method", result);
assertEquals(1, interceptor.getDataPermissionCache().size());
assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
}
@Test // 在 Class 上有 @DataPermission 注解
public void testInvoke_class() throws Throwable {
// 参数
mockMethodInvocation(TestClass.class);
// 调用
Object result = interceptor.invoke(methodInvocation);
// 断言
assertEquals("class", result);
assertEquals(1, interceptor.getDataPermissionCache().size());
assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
}
private void mockMethodInvocation(Class<?> clazz) throws Throwable {
Object targetObject = clazz.newInstance();
Method method = targetObject.getClass().getMethod("echo");
when(methodInvocation.getThis()).thenReturn(targetObject);
when(methodInvocation.getMethod()).thenReturn(method);
when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject));
}
static class TestMethod {
@DataPermission(enable = false)
public String echo() {
return "method";
}
}
@DataPermission(enable = false)
static class TestClass {
public String echo() {
return "class";
}
}
static class TestNone {
public String echo() {
return "none";
}
}
}
//package cn.hangtag.framework.datapermission.core.aop;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hangtag.framework.datapermission.core.annotation.DataPermission;
//import cn.hangtag.framework.test.core.ut.BaseMockitoUnitTest;
//import org.aopalliance.intercept.MethodInvocation;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.mockito.InjectMocks;
//import org.mockito.Mock;
//
//import java.lang.reflect.Method;
//
//import static org.junit.jupiter.api.Assertions.*;
//import static org.mockito.Mockito.when;
//
///**
// * {@link DataPermissionAnnotationInterceptor} 的单元测试
// *
// * @author 芋道源码
// */
//public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest {
//
// @InjectMocks
// private DataPermissionAnnotationInterceptor interceptor;
//
// @Mock
// private MethodInvocation methodInvocation;
//
// @BeforeEach
// public void setUp() {
// interceptor.getDataPermissionCache().clear();
// }
//
// @Test // 无 @DataPermission 注解
// public void testInvoke_none() throws Throwable {
// // 参数
// mockMethodInvocation(TestNone.class);
//
// // 调用
// Object result = interceptor.invoke(methodInvocation);
// // 断言
// assertEquals("none", result);
// assertEquals(1, interceptor.getDataPermissionCache().size());
// assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
// }
//
// @Test // 在 Method 上有 @DataPermission 注解
// public void testInvoke_method() throws Throwable {
// // 参数
// mockMethodInvocation(TestMethod.class);
//
// // 调用
// Object result = interceptor.invoke(methodInvocation);
// // 断言
// assertEquals("method", result);
// assertEquals(1, interceptor.getDataPermissionCache().size());
// assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
// }
//
// @Test // 在 Class 上有 @DataPermission 注解
// public void testInvoke_class() throws Throwable {
// // 参数
// mockMethodInvocation(TestClass.class);
//
// // 调用
// Object result = interceptor.invoke(methodInvocation);
// // 断言
// assertEquals("class", result);
// assertEquals(1, interceptor.getDataPermissionCache().size());
// assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
// }
//
// private void mockMethodInvocation(Class<?> clazz) throws Throwable {
// Object targetObject = clazz.newInstance();
// Method method = targetObject.getClass().getMethod("echo");
// when(methodInvocation.getThis()).thenReturn(targetObject);
// when(methodInvocation.getMethod()).thenReturn(method);
// when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject));
// }
//
// static class TestMethod {
//
// @DataPermission(enable = false)
// public String echo() {
// return "method";
// }
//
// }
//
// @DataPermission(enable = false)
// static class TestClass {
//
// public String echo() {
// return "class";
// }
//
// }
//
// static class TestNone {
//
// public String echo() {
// return "none";
// }
//
// }
//
//}

View File

@ -1,190 +1,190 @@
package cn.hangtag.framework.datapermission.core.db;
import cn.hangtag.framework.common.util.collection.SetUtils;
import cn.hangtag.framework.datapermission.core.rule.DataPermissionRule;
import cn.hangtag.framework.datapermission.core.rule.DataPermissionRuleFactory;
import cn.hangtag.framework.mybatis.core.util.MyBatisUtils;
import cn.hangtag.framework.test.core.ut.BaseMockitoUnitTest;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.schema.Column;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import java.sql.Connection;
import java.util.*;
import static java.util.Collections.singletonList;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link DataPermissionDatabaseInterceptor} 的单元测试
* 主要测试 {@link DataPermissionDatabaseInterceptor#beforePrepare(StatementHandler, Connection, Integer)}
* 和 {@link DataPermissionDatabaseInterceptor#beforeUpdate(Executor, MappedStatement, Object)}
* 以及在这个过程中,ContextHolder 和 MappedStatementCache
*
* @author 芋道源码
*/
public class DataPermissionDatabaseInterceptorTest extends BaseMockitoUnitTest {
@InjectMocks
private DataPermissionDatabaseInterceptor interceptor;
@Mock
private DataPermissionRuleFactory ruleFactory;
@BeforeEach
public void setUp() {
// 清理上下文
DataPermissionDatabaseInterceptor.ContextHolder.clear();
// 清空缓存
interceptor.getMappedStatementCache().clear();
}
@Test // 不存在规则,且不匹配
public void testBeforeQuery_withoutRule() {
try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// 准备参数
MappedStatement mappedStatement = mock(MappedStatement.class);
BoundSql boundSql = mock(BoundSql.class);
// 调用
interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// 断言
pluginUtilsMock.verify(() -> PluginUtils.mpBoundSql(boundSql), never());
}
}
@Test // 存在规则,且不匹配
public void testBeforeQuery_withMatchRule() {
try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// 准备参数
MappedStatement mappedStatement = mock(MappedStatement.class);
BoundSql boundSql = mock(BoundSql.class);
// mock 方法(数据权限)
when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId())))
.thenReturn(singletonList(new DeptDataPermissionRule()));
// mock 方法(MPBoundSql)
PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class);
pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs);
// mock 方法(SQL)
String sql = "select * from t_user where id = 1";
when(mpBs.sql()).thenReturn(sql);
// 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确
// 调用
interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// 断言
verify(mpBs, times(1)).sql(
eq("SELECT * FROM t_user WHERE id = 1 AND t_user.dept_id = 100"));
// 断言缓存
assertTrue(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty());
}
}
@Test // 存在规则,但不匹配
public void testBeforeQuery_withoutMatchRule() {
try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// 准备参数
MappedStatement mappedStatement = mock(MappedStatement.class);
BoundSql boundSql = mock(BoundSql.class);
// mock 方法(数据权限)
when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId())))
.thenReturn(singletonList(new DeptDataPermissionRule()));
// mock 方法(MPBoundSql)
PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class);
pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs);
// mock 方法(SQL)
String sql = "select * from t_role where id = 1";
when(mpBs.sql()).thenReturn(sql);
// 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确
// 调用
interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// 断言
verify(mpBs, times(1)).sql(
eq("SELECT * FROM t_role WHERE id = 1"));
// 断言缓存
assertFalse(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty());
}
}
@Test
public void testAddNoRewritable() {
// 准备参数
MappedStatement ms = mock(MappedStatement.class);
List<DataPermissionRule> rules = singletonList(new DeptDataPermissionRule());
// mock 方法
when(ms.getId()).thenReturn("selectById");
// 调用
interceptor.getMappedStatementCache().addNoRewritable(ms, rules);
// 断言
Map<Class<? extends DataPermissionRule>, Set<String>> noRewritableMappedStatements =
interceptor.getMappedStatementCache().getNoRewritableMappedStatements();
assertEquals(1, noRewritableMappedStatements.size());
assertEquals(SetUtils.asSet("selectById"), noRewritableMappedStatements.get(DeptDataPermissionRule.class));
}
@Test
public void testNoRewritable() {
// 准备参数
MappedStatement ms = mock(MappedStatement.class);
// mock 方法
when(ms.getId()).thenReturn("selectById");
// mock 数据
List<DataPermissionRule> rules = singletonList(new DeptDataPermissionRule());
interceptor.getMappedStatementCache().addNoRewritable(ms, rules);
// 场景一,rules 为空
assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, null));
// 场景二,rules 非空,可重写
assertFalse(interceptor.getMappedStatementCache().noRewritable(ms, singletonList(new EmptyDataPermissionRule())));
// 场景三,rule 非空,不可重写
assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, rules));
}
private static class DeptDataPermissionRule implements DataPermissionRule {
private static final String COLUMN = "dept_id";
@Override
public Set<String> getTableNames() {
return SetUtils.asSet("t_user");
}
@Override
public Expression getExpression(String tableName, Alias tableAlias) {
Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
LongValue value = new LongValue(100L);
return new EqualsTo(column, value);
}
}
private static class EmptyDataPermissionRule implements DataPermissionRule {
@Override
public Set<String> getTableNames() {
return Collections.emptySet();
}
@Override
public Expression getExpression(String tableName, Alias tableAlias) {
return null;
}
}
}
//package cn.hangtag.framework.datapermission.core.db;
//
//import cn.hangtag.framework.common.util.collection.SetUtils;
//import cn.hangtag.framework.datapermission.core.rule.DataPermissionRule;
//import cn.hangtag.framework.datapermission.core.rule.DataPermissionRuleFactory;
//import cn.hangtag.framework.mybatis.core.util.MyBatisUtils;
//import cn.hangtag.framework.test.core.ut.BaseMockitoUnitTest;
//import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
//import net.sf.jsqlparser.expression.Alias;
//import net.sf.jsqlparser.expression.Expression;
//import net.sf.jsqlparser.expression.LongValue;
//import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
//import net.sf.jsqlparser.schema.Column;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.mockito.InjectMocks;
//import org.mockito.Mock;
//import org.mockito.MockedStatic;
//
//import java.sql.Connection;
//import java.util.*;
//
//import static java.util.Collections.singletonList;
//import static org.junit.jupiter.api.Assertions.*;
//import static org.mockito.Mockito.*;
//
///**
// * {@link DataPermissionDatabaseInterceptor} 的单元测试
// * 主要测试 {@link DataPermissionDatabaseInterceptor#beforePrepare(StatementHandler, Connection, Integer)}
// * 和 {@link DataPermissionDatabaseInterceptor#beforeUpdate(Executor, MappedStatement, Object)}
// * 以及在这个过程中,ContextHolder 和 MappedStatementCache
// *
// * @author 芋道源码
// */
//public class DataPermissionDatabaseInterceptorTest extends BaseMockitoUnitTest {
//
// @InjectMocks
// private DataPermissionDatabaseInterceptor interceptor;
//
// @Mock
// private DataPermissionRuleFactory ruleFactory;
//
// @BeforeEach
// public void setUp() {
// // 清理上下文
// DataPermissionDatabaseInterceptor.ContextHolder.clear();
// // 清空缓存
// interceptor.getMappedStatementCache().clear();
// }
//
// @Test // 不存在规则,且不匹配
// public void testBeforeQuery_withoutRule() {
// try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// // 准备参数
// MappedStatement mappedStatement = mock(MappedStatement.class);
// BoundSql boundSql = mock(BoundSql.class);
//
// // 调用
// interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// // 断言
// pluginUtilsMock.verify(() -> PluginUtils.mpBoundSql(boundSql), never());
// }
// }
//
// @Test // 存在规则,且不匹配
// public void testBeforeQuery_withMatchRule() {
// try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// // 准备参数
// MappedStatement mappedStatement = mock(MappedStatement.class);
// BoundSql boundSql = mock(BoundSql.class);
// // mock 方法(数据权限)
// when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId())))
// .thenReturn(singletonList(new DeptDataPermissionRule()));
// // mock 方法(MPBoundSql)
// PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class);
// pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs);
// // mock 方法(SQL)
// String sql = "select * from t_user where id = 1";
// when(mpBs.sql()).thenReturn(sql);
// // 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确
//
// // 调用
// interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// // 断言
// verify(mpBs, times(1)).sql(
// eq("SELECT * FROM t_user WHERE id = 1 AND t_user.dept_id = 100"));
// // 断言缓存
// assertTrue(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty());
// }
// }
//
// @Test // 存在规则,但不匹配
// public void testBeforeQuery_withoutMatchRule() {
// try (MockedStatic<PluginUtils> pluginUtilsMock = mockStatic(PluginUtils.class)) {
// // 准备参数
// MappedStatement mappedStatement = mock(MappedStatement.class);
// BoundSql boundSql = mock(BoundSql.class);
// // mock 方法(数据权限)
// when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId())))
// .thenReturn(singletonList(new DeptDataPermissionRule()));
// // mock 方法(MPBoundSql)
// PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class);
// pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs);
// // mock 方法(SQL)
// String sql = "select * from t_role where id = 1";
// when(mpBs.sql()).thenReturn(sql);
// // 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确
//
// // 调用
// interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql);
// // 断言
// verify(mpBs, times(1)).sql(
// eq("SELECT * FROM t_role WHERE id = 1"));
// // 断言缓存
// assertFalse(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty());
// }
// }
//
// @Test
// public void testAddNoRewritable() {
// // 准备参数
// MappedStatement ms = mock(MappedStatement.class);
// List<DataPermissionRule> rules = singletonList(new DeptDataPermissionRule());
// // mock 方法
// when(ms.getId()).thenReturn("selectById");
//
// // 调用
// interceptor.getMappedStatementCache().addNoRewritable(ms, rules);
// // 断言
// Map<Class<? extends DataPermissionRule>, Set<String>> noRewritableMappedStatements =
// interceptor.getMappedStatementCache().getNoRewritableMappedStatements();
// assertEquals(1, noRewritableMappedStatements.size());
// assertEquals(SetUtils.asSet("selectById"), noRewritableMappedStatements.get(DeptDataPermissionRule.class));
// }
//
// @Test
// public void testNoRewritable() {
// // 准备参数
// MappedStatement ms = mock(MappedStatement.class);
// // mock 方法
// when(ms.getId()).thenReturn("selectById");
// // mock 数据
// List<DataPermissionRule> rules = singletonList(new DeptDataPermissionRule());
// interceptor.getMappedStatementCache().addNoRewritable(ms, rules);
//
// // 场景一,rules 为空
// assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, null));
// // 场景二,rules 非空,可重写
// assertFalse(interceptor.getMappedStatementCache().noRewritable(ms, singletonList(new EmptyDataPermissionRule())));
// // 场景三,rule 非空,不可重写
// assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, rules));
// }
//
// private static class DeptDataPermissionRule implements DataPermissionRule {
//
// private static final String COLUMN = "dept_id";
//
// @Override
// public Set<String> getTableNames() {
// return SetUtils.asSet("t_user");
// }
//
// @Override
// public Expression getExpression(String tableName, Alias tableAlias) {
// Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
// LongValue value = new LongValue(100L);
// return new EqualsTo(column, value);
// }
//
// }
//
// private static class EmptyDataPermissionRule implements DataPermissionRule {
//
// @Override
// public Set<String> getTableNames() {
// return Collections.emptySet();
// }
//
// @Override
// public Expression getExpression(String tableName, Alias tableAlias) {
// return null;
// }
//
// }
//
//}

View File

@ -1,51 +1,50 @@
package cn.hangtag.framework.dict.core.util;
import cn.hangtag.framework.common.enums.CommonStatusEnum;
import cn.hangtag.framework.dict.core.DictFrameworkUtils;
import cn.hangtag.framework.test.core.ut.BaseMockitoUnitTest;
import cn.hangtag.module.system.api.dict.DictDataApi;
import cn.hangtag.module.system.api.dict.dto.DictDataRespDTO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import static cn.hangtag.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
/**
* {@link DictFrameworkUtils} 的单元测试
*/
public class DictFrameworkUtilsTest extends BaseMockitoUnitTest {
@Mock
private DictDataApi dictDataApi;
@BeforeEach
public void setUp() {
DictFrameworkUtils.init(dictDataApi);
}
@Test
public void testGetDictDataLabel() {
// mock 数据
DictDataRespDTO dataRespDTO = randomPojo(DictDataRespDTO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
// mock 方法
when(dictDataApi.getDictData(dataRespDTO.getDictType(), dataRespDTO.getValue())).thenReturn(dataRespDTO);
// 断言返回值
assertEquals(dataRespDTO.getLabel(), DictFrameworkUtils.getDictDataLabel(dataRespDTO.getDictType(), dataRespDTO.getValue()));
}
@Test
public void testParseDictDataValue() {
// mock 数据
DictDataRespDTO resp = randomPojo(DictDataRespDTO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
// mock 方法
when(dictDataApi.parseDictData(resp.getDictType(), resp.getLabel())).thenReturn(resp);
// 断言返回值
assertEquals(resp.getValue(), DictFrameworkUtils.parseDictDataValue(resp.getDictType(), resp.getLabel()));
}
}
//package cn.hangtag.framework.dict.core.util;
//
//import cn.hangtag.framework.common.enums.CommonStatusEnum;
//import cn.hangtag.framework.dict.core.DictFrameworkUtils;
//import cn.hangtag.module.system.api.dict.DictDataApi;
//import cn.hangtag.module.system.api.dict.dto.DictDataRespDTO;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.mockito.Mock;
//
//import static cn.hangtag.framework.test.core.util.RandomUtils.randomPojo;
//import static org.junit.jupiter.api.Assertions.assertEquals;
//import static org.mockito.Mockito.when;
//
///**
// * {@link DictFrameworkUtils} 的单元测试
// */
//public class DictFrameworkUtilsTest extends BaseMockitoUnitTest {
//
// @Mock
// private DictDataApi dictDataApi;
//
// @BeforeEach
// public void setUp() {
// DictFrameworkUtils.init(dictDataApi);
// }
//
// @Test
// public void testGetDictDataLabel() {
// // mock 数据
// DictDataRespDTO dataRespDTO = randomPojo(DictDataRespDTO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
// // mock 方法
// when(dictDataApi.getDictData(dataRespDTO.getDictType(), dataRespDTO.getValue())).thenReturn(dataRespDTO);
//
// // 断言返回值
// assertEquals(dataRespDTO.getLabel(), DictFrameworkUtils.getDictDataLabel(dataRespDTO.getDictType(), dataRespDTO.getValue()));
// }
//
// @Test
// public void testParseDictDataValue() {
// // mock 数据
// DictDataRespDTO resp = randomPojo(DictDataRespDTO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
// // mock 方法
// when(dictDataApi.parseDictData(resp.getDictType(), resp.getLabel())).thenReturn(resp);
//
// // 断言返回值
// assertEquals(resp.getValue(), DictFrameworkUtils.parseDictDataValue(resp.getDictType(), resp.getLabel()));
// }
//
//}

View File

@ -1,75 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-mybatis</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>数据库连接池、多数据源、事务、MyBatis 拓展</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-mybatis-plus-extend</artifactId>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-mybatis</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>数据库连接池、多数据源、事务、MyBatis 拓展</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fhs-opensource</groupId>
<artifactId>easy-trans-mybatis-plus-extend</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,34 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-redis</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>Redis 封装拓展</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-redis</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>Redis 封装拓展</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,53 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-security</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>1. security:用户的认证、权限的校验,实现「谁」可以做「什么事」
2. operatelog:操作日志,实现「谁」在「什么时间」对「什么」做了「什么事」</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>io.github.mouzt</groupId>
<artifactId>bizlog-sdk</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-security</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>1. security:用户的认证、权限的校验,实现「谁」可以做「什么事」
2. operatelog:操作日志,实现「谁」在「什么时间」对「什么」做了「什么事」</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>io.github.mouzt</groupId>
<artifactId>bizlog-sdk</artifactId>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>

View File

@ -1,68 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>Web 框架,全局异常、API 日志、脱敏、错误码等</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra-api</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-framework</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-spring-boot-starter-web</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>Web 框架,全局异常、API 日志、脱敏、错误码等</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra-api</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>infra 模块,主要提供两块能力:
1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等
2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等</description>
<modules>
<module>hangtag-module-infra-api</module>
<module>hangtag-module-infra-biz</module>
</modules>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>infra 模块,主要提供两块能力:
1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等
2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等</description>
<modules>
<module>hangtag-module-infra-api</module>
<module>hangtag-module-infra-biz</module>
</modules>
</project>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra-api</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>infra 模块 API,暴露给其它模块调用</description>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-infra-api</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>infra 模块 API,暴露给其它模块调用</description>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@ -1,21 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>system 模块下,我们放通用业务,支撑上层的核心业务。
例如说:用户、部门、权限、数据字典等等</description>
<modules>
<module>hangtag-module-system-api</module>
<module>hangtag-module-system-biz</module>
</modules>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>system 模块下,我们放通用业务,支撑上层的核心业务。
例如说:用户、部门、权限、数据字典等等</description>
<modules>
<module>hangtag-module-system-api</module>
<module>hangtag-module-system-biz</module>
</modules>
</project>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>system 模块 API,暴露给其它模块调用</description>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system</artifactId>
<version>2.1.0-jdk8-snapshot</version>
</parent>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-module-system-api</artifactId>
<version>2.1.0-jdk8-snapshot</version>
<name>${project.artifactId}</name>
<description>system 模块 API,暴露给其它模块调用</description>
<dependencies>
<dependency>
<groupId>cn.hangtag</groupId>
<artifactId>hangtag-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>

View File

@ -159,7 +159,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remarks2">
<el-input v-model="formData.remarks2" placeholder="请输入备注" />
<el-input v-model="formData.remarks2" placeholder="请输入备注" type="textarea" :autosize="{ minRows: 2, maxRows: 30 }" />
</el-form-item>
</el-col>
</el-row>