Commit 2f0d7e8aba72d8239c597bad6e27a84477ce5272
1 parent
99855e7c
单元测试,接入 h2 实现单元测试
Showing
11 changed files
with
371 additions
and
49 deletions
pom.xml
| @@ -177,6 +177,12 @@ | @@ -177,6 +177,12 @@ | ||
| 177 | <scope>test</scope> | 177 | <scope>test</scope> |
| 178 | </dependency> | 178 | </dependency> |
| 179 | 179 | ||
| 180 | + <dependency> | ||
| 181 | + <groupId>com.h2database</groupId> <!-- 单元测试,我们采用 H2 作为数据库 --> | ||
| 182 | + <artifactId>h2</artifactId> | ||
| 183 | + <scope>test</scope> | ||
| 184 | + </dependency> | ||
| 185 | + | ||
| 180 | <!-- 工具类相关 --> | 186 | <!-- 工具类相关 --> |
| 181 | <dependency> | 187 | <dependency> |
| 182 | <groupId>org.projectlombok</groupId> | 188 | <groupId>org.projectlombok</groupId> |
src/main/java/cn/iocoder/dashboard/framework/redis/config/RedisConfig.java
| @@ -27,7 +27,7 @@ public class RedisConfig { | @@ -27,7 +27,7 @@ public class RedisConfig { | ||
| 27 | template.setConnectionFactory(factory); | 27 | template.setConnectionFactory(factory); |
| 28 | // 使用 String 序列化方式,序列化 KEY 。 | 28 | // 使用 String 序列化方式,序列化 KEY 。 |
| 29 | template.setKeySerializer(RedisSerializer.string()); | 29 | template.setKeySerializer(RedisSerializer.string()); |
| 30 | - // 使用 JSON 序列化方式(库是 FastJSON ),序列化 VALUE 。 | 30 | + // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 |
| 31 | template.setValueSerializer(RedisSerializer.json()); | 31 | template.setValueSerializer(RedisSerializer.json()); |
| 32 | return template; | 32 | return template; |
| 33 | } | 33 | } |
src/main/java/cn/iocoder/dashboard/modules/infra/enums/InfErrorCodeConstants.java
| @@ -11,7 +11,7 @@ public interface InfErrorCodeConstants { | @@ -11,7 +11,7 @@ public interface InfErrorCodeConstants { | ||
| 11 | 11 | ||
| 12 | // ========== 参数配置 1001000000 ========== | 12 | // ========== 参数配置 1001000000 ========== |
| 13 | ErrorCode CONFIG_NOT_FOUND = new ErrorCode(1001000001, "参数配置不存在"); | 13 | ErrorCode CONFIG_NOT_FOUND = new ErrorCode(1001000001, "参数配置不存在"); |
| 14 | - ErrorCode CONFIG_NAME_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复"); | 14 | + ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复"); |
| 15 | ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置"); | 15 | ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置"); |
| 16 | ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1001000004, "不允许获取敏感配置到前端"); | 16 | ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1001000004, "不允许获取敏感配置到前端"); |
| 17 | 17 |
src/main/java/cn/iocoder/dashboard/modules/infra/service/config/impl/InfConfigServiceImpl.java
| @@ -117,10 +117,10 @@ public class InfConfigServiceImpl implements InfConfigService { | @@ -117,10 +117,10 @@ public class InfConfigServiceImpl implements InfConfigService { | ||
| 117 | } | 117 | } |
| 118 | // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 | 118 | // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 |
| 119 | if (id == null) { | 119 | if (id == null) { |
| 120 | - throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE); | 120 | + throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); |
| 121 | } | 121 | } |
| 122 | if (!config.getId().equals(id)) { | 122 | if (!config.getId().equals(id)) { |
| 123 | - throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE); | 123 | + throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE); |
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 |
src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceImplTest.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.infra.service.config; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.dashboard.common.exception.ServiceException; | ||
| 4 | +import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; | ||
| 5 | +import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; | ||
| 6 | +import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigMapper; | ||
| 7 | +import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum; | ||
| 8 | +import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer; | ||
| 9 | +import cn.iocoder.dashboard.modules.infra.service.config.impl.InfConfigServiceImpl; | ||
| 10 | +import cn.iocoder.dashboard.util.AssertUtils; | ||
| 11 | +import org.junit.jupiter.api.Test; | ||
| 12 | +import org.springframework.boot.test.context.SpringBootTest; | ||
| 13 | +import org.springframework.boot.test.mock.mockito.MockBean; | ||
| 14 | +import org.springframework.test.context.ActiveProfiles; | ||
| 15 | +import org.springframework.test.context.jdbc.Sql; | ||
| 16 | + | ||
| 17 | +import javax.annotation.Resource; | ||
| 18 | + | ||
| 19 | +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.CONFIG_KEY_DUPLICATE; | ||
| 20 | +import static org.junit.jupiter.api.Assertions.*; | ||
| 21 | +import static org.mockito.Mockito.times; | ||
| 22 | +import static org.mockito.Mockito.verify; | ||
| 23 | + | ||
| 24 | +@SpringBootTest | ||
| 25 | +@ActiveProfiles("unit-test") | ||
| 26 | +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) | ||
| 27 | +public class InfConfigServiceImplTest { | ||
| 28 | + | ||
| 29 | + @Resource | ||
| 30 | + private InfConfigServiceImpl configService; | ||
| 31 | + | ||
| 32 | + @Resource | ||
| 33 | + private InfConfigMapper configMapper; | ||
| 34 | + | ||
| 35 | + @MockBean | ||
| 36 | + private InfConfigProducer configProducer; | ||
| 37 | + | ||
| 38 | + @Test | ||
| 39 | + public void testCreateConfig_success() { | ||
| 40 | + // 入参 | ||
| 41 | + InfConfigCreateReqVO reqVO = new InfConfigCreateReqVO(); | ||
| 42 | + reqVO.setGroup("test_group"); | ||
| 43 | + reqVO.setName("test_name"); | ||
| 44 | + reqVO.setValue("test_value"); | ||
| 45 | + reqVO.setSensitive(true); | ||
| 46 | + reqVO.setRemark("test_remark"); | ||
| 47 | + reqVO.setKey("test_key"); | ||
| 48 | + // mock | ||
| 49 | + | ||
| 50 | + // 调用 | ||
| 51 | + Long configId = configService.createConfig(reqVO); | ||
| 52 | + // 校验 | ||
| 53 | + assertNotNull(configId); | ||
| 54 | + // 校验记录的属性是否正确 | ||
| 55 | + InfConfigDO config = configMapper.selectById(configId); | ||
| 56 | + AssertUtils.assertEquals(reqVO, config); | ||
| 57 | + assertEquals(InfConfigTypeEnum.CUSTOM.getType(), config.getType()); | ||
| 58 | + // 校验调用 | ||
| 59 | + verify(configProducer, times(1)).sendConfigRefreshMessage(); | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + @Test | ||
| 63 | + @Sql(statements = "INSERT INTO `inf_config`(`group`, `type`, `name`, `key`, `value`, `sensitive`) VALUES ('test_group', 1, 'test_name', 'test_key', 'test_value', 1);") | ||
| 64 | + public void testCreateConfig_keyDuplicate() { | ||
| 65 | + // 入参 | ||
| 66 | + InfConfigCreateReqVO reqVO = new InfConfigCreateReqVO(); | ||
| 67 | + reqVO.setGroup("test_group"); | ||
| 68 | + reqVO.setName("test_name"); | ||
| 69 | + reqVO.setValue("test_value"); | ||
| 70 | + reqVO.setSensitive(true); | ||
| 71 | + reqVO.setRemark("test_remark"); | ||
| 72 | + reqVO.setKey("test_key"); | ||
| 73 | + // mock | ||
| 74 | + | ||
| 75 | + // 调用 | ||
| 76 | + ServiceException serviceException = assertThrows(ServiceException.class, () -> configService.createConfig(reqVO)); | ||
| 77 | + // 断言 | ||
| 78 | + AssertUtils.assertEquals(CONFIG_KEY_DUPLICATE, serviceException); | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | +} |
src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/coegen/ToolInformationSchemaColumnMapperTest.java
| @@ -3,19 +3,23 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.coegen; | @@ -3,19 +3,23 @@ package cn.iocoder.dashboard.modules.tool.dal.mysql.coegen; | ||
| 3 | import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; | 3 | import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolSchemaColumnDO; |
| 4 | import org.junit.jupiter.api.Test; | 4 | import org.junit.jupiter.api.Test; |
| 5 | import org.springframework.boot.test.context.SpringBootTest; | 5 | import org.springframework.boot.test.context.SpringBootTest; |
| 6 | +import org.springframework.test.context.ActiveProfiles; | ||
| 7 | +import org.springframework.test.context.jdbc.Sql; | ||
| 6 | 8 | ||
| 7 | import javax.annotation.Resource; | 9 | import javax.annotation.Resource; |
| 8 | import java.util.List; | 10 | import java.util.List; |
| 9 | 11 | ||
| 10 | -import static org.junit.jupiter.api.Assertions.*; | 12 | +import static org.junit.jupiter.api.Assertions.assertTrue; |
| 11 | 13 | ||
| 12 | @SpringBootTest | 14 | @SpringBootTest |
| 15 | +@ActiveProfiles("unit-test") | ||
| 13 | public class ToolInformationSchemaColumnMapperTest { | 16 | public class ToolInformationSchemaColumnMapperTest { |
| 14 | 17 | ||
| 15 | @Resource | 18 | @Resource |
| 16 | private ToolSchemaColumnMapper toolInformationSchemaColumnMapper; | 19 | private ToolSchemaColumnMapper toolInformationSchemaColumnMapper; |
| 17 | 20 | ||
| 18 | @Test | 21 | @Test |
| 22 | + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) | ||
| 19 | public void testSelectListByTableName() { | 23 | public void testSelectListByTableName() { |
| 20 | List<ToolSchemaColumnDO> columns = toolInformationSchemaColumnMapper | 24 | List<ToolSchemaColumnDO> columns = toolInformationSchemaColumnMapper |
| 21 | .selectListByTableName("inf_config"); | 25 | .selectListByTableName("inf_config"); |
src/test/java/cn/iocoder/dashboard/util/AssertUtils.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.util; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.util.ReflectUtil; | ||
| 4 | +import cn.iocoder.dashboard.common.exception.ErrorCode; | ||
| 5 | +import cn.iocoder.dashboard.common.exception.ServiceException; | ||
| 6 | +import org.junit.jupiter.api.Assertions; | ||
| 7 | + | ||
| 8 | +import java.lang.reflect.Field; | ||
| 9 | +import java.util.Arrays; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * 单元测试,assert 断言工具类 | ||
| 13 | + * | ||
| 14 | + * @author 芋道源码 | ||
| 15 | + */ | ||
| 16 | +public class AssertUtils { | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 比对两个对象的属性是否一致 | ||
| 20 | + * | ||
| 21 | + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略 | ||
| 22 | + * | ||
| 23 | + * @param expected 期望对象 | ||
| 24 | + * @param actual 实际对象 | ||
| 25 | + */ | ||
| 26 | + public static void assertEquals(Object expected, Object actual) { | ||
| 27 | + Field[] expectedFields = ReflectUtil.getFields(expected.getClass()); | ||
| 28 | + Arrays.stream(expectedFields).forEach(expectedField -> { | ||
| 29 | + // 忽略不存在的属性 | ||
| 30 | + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName()); | ||
| 31 | + if (actualField == null) { | ||
| 32 | + return; | ||
| 33 | + } | ||
| 34 | + // 比对 | ||
| 35 | + Assertions.assertEquals( | ||
| 36 | + ReflectUtil.getFieldValue(expected, expectedField), | ||
| 37 | + ReflectUtil.getFieldValue(actual, actualField), | ||
| 38 | + String.format("Field(%s) 不匹配", expectedField.getName()) | ||
| 39 | + ); | ||
| 40 | + }); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + /** | ||
| 44 | + * 比对抛出的 ServiceException 是否匹配 | ||
| 45 | + * | ||
| 46 | + * @param errorCode 错误码对象 | ||
| 47 | + * @param serviceException 业务异常 | ||
| 48 | + */ | ||
| 49 | + public static void assertEquals(ErrorCode errorCode, ServiceException serviceException) { | ||
| 50 | + Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配"); | ||
| 51 | + Assertions.assertEquals(errorCode.getMessage(), serviceException.getMessage(), "错误提示不匹配"); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | +} |
src/test/resources/application-unit-test.yaml
0 → 100644
| 1 | +spring: | ||
| 2 | + main: | ||
| 3 | + lazy-initialization: true | ||
| 4 | + | ||
| 5 | + # 去除的自动配置项 | ||
| 6 | + autoconfigure: | ||
| 7 | + exclude: | ||
| 8 | + - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration # 单元测试,禁用 SpringSecurity | ||
| 9 | + - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration # 单元测试,禁用 SpringSecurity | ||
| 10 | + - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 单元测试,禁用 Quartz | ||
| 11 | + - com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration # 单元测试,禁用 Lock4j 分布式锁 | ||
| 12 | + | ||
| 13 | +--- #################### 数据库相关配置 #################### | ||
| 14 | + | ||
| 15 | +spring: | ||
| 16 | + # 数据源配置项 | ||
| 17 | + datasource: | ||
| 18 | + name: ruoyi-vue-pro | ||
| 19 | + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 | ||
| 20 | + driver-class-name: org.h2.Driver | ||
| 21 | + username: sa | ||
| 22 | + password: | ||
| 23 | + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 | ||
| 24 | + | ||
| 25 | + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 | ||
| 26 | + redis: | ||
| 27 | + host: 127.0.0.1 # 地址 | ||
| 28 | + port: 6379 # 端口 | ||
| 29 | + database: 0 # 数据库索引 | ||
| 30 | + | ||
| 31 | +--- #################### 定时任务相关配置 #################### | ||
| 32 | + | ||
| 33 | +# Quartz 配置项,对应 QuartzProperties 配置类(单元测试,禁用 Quartz) | ||
| 34 | + | ||
| 35 | +--- #################### 配置中心相关配置 #################### | ||
| 36 | + | ||
| 37 | +# Apollo 配置中心 | ||
| 38 | +apollo: | ||
| 39 | + bootstrap: | ||
| 40 | + enabled: false # 单元测试,禁用配置中心 | ||
| 41 | + | ||
| 42 | +--- #################### 服务保障相关配置 #################### | ||
| 43 | + | ||
| 44 | +# Lock4j 配置项(单元测试,禁用 Lock4j) | ||
| 45 | + | ||
| 46 | +# Resilience4j 配置项 | ||
| 47 | +resilience4j: | ||
| 48 | + ratelimiter: | ||
| 49 | + instances: | ||
| 50 | + backendA: | ||
| 51 | + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 | ||
| 52 | + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 | ||
| 53 | + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s | ||
| 54 | + register-health-indicator: true # 是否注册到健康监测 | ||
| 55 | + | ||
| 56 | +--- #################### 监控相关配置 #################### | ||
| 57 | + | ||
| 58 | +# Actuator 监控端点的配置项 | ||
| 59 | +management: | ||
| 60 | + endpoints: | ||
| 61 | + enabled-by-default: false | ||
| 62 | + | ||
| 63 | +# Spring Boot Admin 配置项 | ||
| 64 | +spring: | ||
| 65 | + boot: | ||
| 66 | + admin: | ||
| 67 | + # Spring Boot Admin Client 客户端的相关配置 | ||
| 68 | + client: | ||
| 69 | + enabled: false | ||
| 70 | + # Spring Boot Admin Server 服务端的相关配置 | ||
| 71 | + context-path: /admin # 配置 Spring | ||
| 72 | + | ||
| 73 | +# 日志文件配置 | ||
| 74 | +logging: | ||
| 75 | + file: | ||
| 76 | + path: ${user.home}/logs/ # 日志文件的路径 | ||
| 77 | + | ||
| 78 | +--- #################### 芋道相关配置 #################### | ||
| 79 | + | ||
| 80 | +# 芋道配置项,设置当前项目所有自定义的配置 | ||
| 81 | +yudao: | ||
| 82 | + info: | ||
| 83 | + version: 1.0.0 | ||
| 84 | + base-package: cn.iocoder.dashboard | ||
| 85 | + web: | ||
| 86 | + api-prefix: /api | ||
| 87 | + controller-package: ${yudao.info.base-package} | ||
| 88 | + security: | ||
| 89 | + token-header: Authorization | ||
| 90 | + token-secret: abcdefghijklmnopqrstuvwxyz | ||
| 91 | + token-timeout: 1d | ||
| 92 | + session-timeout: 30m | ||
| 93 | + mock-enable: true | ||
| 94 | + mock-secret: test | ||
| 95 | + swagger: | ||
| 96 | + enable: false # 单元测试,禁用 Swagger | ||
| 97 | + captcha: | ||
| 98 | + timeout: 5m | ||
| 99 | + width: 160 | ||
| 100 | + height: 60 | ||
| 101 | + file: | ||
| 102 | + base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/ | ||
| 103 | + codegen: | ||
| 104 | + base-package: ${yudao.info.base-package}.modules | ||
| 105 | + db-schemas: ${spring.datasource.name} | ||
| 106 | + xss: | ||
| 107 | + enable: false | ||
| 108 | + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 | ||
| 109 | + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 | ||
| 110 | + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 |
src/test/resources/application.yaml deleted
| 1 | -spring: | ||
| 2 | - application: | ||
| 3 | - name: dashboard | ||
| 4 | - | ||
| 5 | - profiles: | ||
| 6 | - active: local | ||
| 7 | - | ||
| 8 | - # Servlet 配置 | ||
| 9 | - servlet: | ||
| 10 | - # 文件上传相关配置项 | ||
| 11 | - multipart: | ||
| 12 | - max-file-size: 16MB # 单个文件大小 | ||
| 13 | - max-request-size: 32MB # 设置总上传的文件大小 | ||
| 14 | - | ||
| 15 | - # Jackson 配置项 | ||
| 16 | - jackson: | ||
| 17 | - serialization: | ||
| 18 | - write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 | ||
| 19 | - write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 | ||
| 20 | - write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 | ||
| 21 | - fail-on-empty-beans: false # 允许序列化无属性的 Bean | ||
| 22 | - | ||
| 23 | - main: | ||
| 24 | - lazy-initialization: true | ||
| 25 | - | ||
| 26 | - # 去除的自动配置项 | ||
| 27 | - autoconfigure: | ||
| 28 | - exclude: | ||
| 29 | - - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration | ||
| 30 | - - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration | ||
| 31 | - - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration | ||
| 32 | - | ||
| 33 | -# MyBatis Plus 的配置项 | ||
| 34 | -mybatis-plus: | ||
| 35 | - configuration: | ||
| 36 | - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 | ||
| 37 | -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 | ||
| 38 | - global-config: | ||
| 39 | - db-config: | ||
| 40 | - id-type: AUTO # 自增 ID | ||
| 41 | - logic-delete-value: 1 # 逻辑已删除值(默认为 1) | ||
| 42 | - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) | ||
| 43 | - mapper-locations: classpath*:mapper/*.xml | ||
| 44 | - type-aliases-package: ${yudao.info.base-package}.modules.*.dal.dataobject |
src/test/resources/sql/clean.sql
0 → 100644
src/test/resources/sql/create_tables.sql
0 → 100644
| 1 | +-- inf 开头的 DB | ||
| 2 | + | ||
| 3 | +CREATE TABLE "inf_config" ( | ||
| 4 | + "id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 5 | + "group" varchar(50) NOT NULL, | ||
| 6 | + "type" tinyint NOT NULL, | ||
| 7 | + "name" varchar(100) NOT NULL DEFAULT '', | ||
| 8 | + "key" varchar(100) NOT NULL DEFAULT '', | ||
| 9 | + "value" varchar(500) NOT NULL DEFAULT '', | ||
| 10 | + "sensitive" bit NOT NULL, | ||
| 11 | + "remark" varchar(500) DEFAULT NULL, | ||
| 12 | + "create_by" varchar(64) DEFAULT '', | ||
| 13 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 14 | + "update_by" varchar(64) DEFAULT '', | ||
| 15 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 16 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 17 | + PRIMARY KEY ("id") | ||
| 18 | +) COMMENT '参数配置表'; | ||
| 19 | + | ||
| 20 | +-- sys 开头的 DB | ||
| 21 | + | ||
| 22 | +CREATE TABLE "sys_dept" ( | ||
| 23 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 24 | + "name" varchar(30) NOT NULL DEFAULT '', | ||
| 25 | + "parent_id" bigint NOT NULL DEFAULT '0', | ||
| 26 | + "sort" int NOT NULL DEFAULT '0', | ||
| 27 | + "leader" varchar(20) DEFAULT NULL, | ||
| 28 | + "phone" varchar(11) DEFAULT NULL, | ||
| 29 | + "email" varchar(50) DEFAULT NULL, | ||
| 30 | + "status" tinyint NOT NULL, | ||
| 31 | + "create_by" varchar(64) DEFAULT '', | ||
| 32 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 33 | + "update_by" varchar(64) DEFAULT '', | ||
| 34 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 35 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 36 | + PRIMARY KEY ("id") | ||
| 37 | +) COMMENT '部门表'; | ||
| 38 | + | ||
| 39 | +CREATE TABLE "sys_dict_data" ( | ||
| 40 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 41 | + "sort" int NOT NULL DEFAULT '0', | ||
| 42 | + "label" varchar(100) NOT NULL DEFAULT '', | ||
| 43 | + "value" varchar(100) NOT NULL DEFAULT '', | ||
| 44 | + "dict_type" varchar(100) NOT NULL DEFAULT '', | ||
| 45 | + "status" tinyint NOT NULL DEFAULT '0', | ||
| 46 | + "remark" varchar(500) DEFAULT NULL, | ||
| 47 | + "create_by" varchar(64) DEFAULT '', | ||
| 48 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 49 | + "update_by" varchar(64) DEFAULT '', | ||
| 50 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 51 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 52 | + PRIMARY KEY ("id") | ||
| 53 | +) COMMENT '字典数据表'; | ||
| 54 | + | ||
| 55 | +CREATE TABLE "sys_role" ( | ||
| 56 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 57 | + "name" varchar(30) NOT NULL, | ||
| 58 | + "code" varchar(100) NOT NULL, | ||
| 59 | + "sort" int NOT NULL, | ||
| 60 | + "data_scope" tinyint NOT NULL DEFAULT '1', | ||
| 61 | + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', | ||
| 62 | + "status" tinyint NOT NULL, | ||
| 63 | + "type" tinyint NOT NULL, | ||
| 64 | + "remark" varchar(500) DEFAULT NULL, | ||
| 65 | + "create_by" varchar(64) DEFAULT '', | ||
| 66 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 67 | + "update_by" varchar(64) DEFAULT '', | ||
| 68 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 69 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 70 | + PRIMARY KEY ("id") | ||
| 71 | +) COMMENT '角色信息表'; | ||
| 72 | + | ||
| 73 | +CREATE TABLE "sys_role_menu" ( | ||
| 74 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 75 | + "role_id" bigint NOT NULL, | ||
| 76 | + "menu_id" bigint NOT NULL, | ||
| 77 | + "create_by" varchar(64) DEFAULT '', | ||
| 78 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 79 | + "update_by" varchar(64) DEFAULT '', | ||
| 80 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 81 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 82 | + PRIMARY KEY ("id") | ||
| 83 | +) COMMENT '角色和菜单关联表'; | ||
| 84 | + | ||
| 85 | +CREATE TABLE "sys_menu" ( | ||
| 86 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 87 | + "name" varchar(50) NOT NULL, | ||
| 88 | + "permission" varchar(100) NOT NULL DEFAULT '', | ||
| 89 | + "menu_type" tinyint NOT NULL, | ||
| 90 | + "sort" int NOT NULL DEFAULT '0', | ||
| 91 | + "parent_id" bigint NOT NULL DEFAULT '0', | ||
| 92 | + "path" varchar(200) DEFAULT '', | ||
| 93 | + "icon" varchar(100) DEFAULT '#', | ||
| 94 | + "component" varchar(255) DEFAULT NULL, | ||
| 95 | + "status" tinyint NOT NULL DEFAULT '0', | ||
| 96 | + "create_by" varchar(64) DEFAULT '', | ||
| 97 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 98 | + "update_by" varchar(64) DEFAULT '', | ||
| 99 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 100 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 101 | + PRIMARY KEY ("id") | ||
| 102 | +) COMMENT '菜单权限表'; |